1

这只是一个“好的”pythonic方式的好奇问题。

我有一个带有可选参数的函数,即。

def foo( a, b, c='en' ):
    print c

有一个包含一堆信息的字典,如果字典中有特定的键,我想将它传递给 foo 以覆盖 c 的默认值,但如果键不在字典中,我只想使用c的默认值。

显然这会起作用......

if "SomeKey" in mydict:
    foo( val1, val2, mydict[ "SomeKey" ]
else:
    foo( val1, val2 )

另一种选择是做类似的事情

params = [ val1, val2 ]
if "SomeKey" in mydict:
    params.append( mydict[ "SomeKey" ] )
foo( *params )

但是必须有一种巧妙的,更蟒蛇的方式来做到这一点?IE。

foo( val1, val2, mydict[ "SomeKey" ] if "SomeKey" in mydict else < use default > )

提前致谢!

4

3 回答 3

4

如果您知道默认值,则可以使用dict.get

foo(val1, val2, mydict.get('SomeKey', 'en'))
于 2012-10-26T17:34:06.097 回答
4

不要为此使用“真实”默认值 - 而是使用占位符值:

def foo( a, b, c=None ):
    if c is None:
        c = 'en'
    print c

然后打电话给...

foo( val1, val2, mydict.get("SomeKey") )

(默认情况下,如果键不在字典中,则.get()返回)None


如果你不能修改foo(),那么你可以做更复杂的可变参数路径:

maybe_c = {'c': mydict["SomeKey"]} if "SomeKey" in mydict else {}
foo( val1, val2, **maybe_c )
于 2012-10-26T17:34:48.067 回答
2

你能惹foo吗?

def foo(a,b,c='en',**kwargs):
    ...

然后用你的字典调用它:

foo('bar','baz',**mydict)

一种丑陋的方法(不会与 foo 混淆)是:

foo( val1,val2,mydict[ "SomeKey" ]) if "SomeKey" in mydict else foo(val1,val2)

虽然真的,我的首选方法 - 假设foo 不能引发 KeyError将是:(特别是如果'SomeKey'经常出现在 dict 中):

try:
    foo(val1,val2,c=mydict['SomeKey'])
except KeyError:
    foo(val1,val2)

这避免了重复的键查找,并明确表明您正在使用默认参数调用函数。


或phihag 提到的 plus inspectdict.get

foo(val1,val2,mydict.get('SomeKey',inspect.getargspec(foo).defaults[0]))

请注意,如果您使用这个,并且foo将被反复检查,您可能希望将结果保存在您可以访问它的地方。

于 2012-10-26T17:33:49.517 回答