4

私には2つの機能があります:

def f(a,b,c=g(b)):
    blabla

def g(n):
    blabla

cfunction のオプションの引数ですf。ユーザーがその値を指定しない場合、プログラムは g(b) を計算する必要があり、それが の値になりますc。しかし、コードはコンパイルされません - name 'b' is not defined と表示されます。それを修正する方法は?

誰かが提案した:

def g(b):
    blabla

def f(a,b,c=None):
    if c is None:
        c = g(b)
    blabla

しかし、これはうまくいきません。おそらく、ユーザーcは None を意図していたのに、c別の値を持つことになります。

4

5 に答える 5

28
def f(a,b,c=None):
    if c is None:
        c = g(b)

Noneが有効な値である場合は、次のcようにします。

sentinel = object()
def f(a,b,c=sentinel):
    if c is sentinel:
        c = g(b)
于 2009-07-13T09:26:54.713 に答える
3

そのようにすることはできません。

関数内で c が指定されているかどうかを確認します。そうでない場合は、計算を行います。

def f(a,b,c=None):
    if c == None:
        c = g(b)
    blabla
于 2009-07-13T09:26:21.560 に答える
2

の値はコンパイル時cに評価されます ( )。したがって、事前に定義g(b)する必要があります。もちろん、その段階でもグローバル変数を定義する必要があります。gfb

b = 4

def g(a):
    return a+1

def test(a, c=g(b)):
    print(c)

test(b)

5を印刷します。

于 2009-07-13T09:26:07.007 に答える
1

問題は

sentinel = object()
def f(a, b, c=sentinel):
  if c is sentinel:
    c = g(b)

sentinelこのコードが関数/メソッドの一部でない限り、それはグローバル/パブリックです。そのため、誰かがまだ電話できる可能性がありますf(23, 42, sentinel)。ただし、fがグローバル/パブリックの場合、クロージャを使用してsentinelローカル/プライベートにすることで、呼び出し元が使用できないようにすることができます。

def f():
  sentinel = object()
  def tmp(a, b, c=sentinel):
    if c is sentinel:
      c = g(b)
  return tmp
f = f()

静的コード アナライザーがそれについて間違った考えを取得する可能性があることを懸念している場合はf、ファクトリに同じパラメーターを使用できます。

def f(a, b, c=object()): #@UnusedVariable
  sentinel = object()
  def tmp(a, b, c=sentinel):
    if c is sentinel:
      c = g(b)
  return tmp
f = f(23, 42)
于 2010-05-23T22:06:39.997 に答える