4

我有两个功能:

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

def g(n):
    blabla

c是函数中的可选参数f。如果用户未指定其值,则程序应计算 g(b),这将是 的值c。但是代码无法编译 - 它说名称“b”未定义。如何解决?

有人建议:

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

的值cg(b)在编译时评估 ()。因此,您需要g在之前定义f。当然,您还需要b在该阶段定义一个全局变量。

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 回答
0
def f(a,b,*args):
    if len(args) == 1:
        c = args[0]
    elif len(args) == 0:
        c = g(b)
    else:
        raise Exception('Function takes 2 or 3 parameters only.')
    blabla

def g(n):
    blabla

您可能可以更好地构建它,但这是主要思想。或者,您可以使用**kwargs和使用类似的功能f(a,b,c=Something),您只需进行相应的修改f

文档

于 2009-07-13T10:39:09.510 回答