鉴于Python函数:
def a_method(arg1, arg2):
pass
Run Code Online (Sandbox Code Playgroud)
如何提取参数的数量和名称.即,鉴于我有一个func的引用,我想要返回func.[something]("arg1","arg2").
这种情况的使用场景是我有一个装饰器,我希望使用方法参数的顺序与它们为实际函数出现的顺序相同.也就是说,当我调用aMethod("a","b")时,装饰器看起来会打印出"a,b"吗?
有一个带有可选参数的函数.
def alpha(p1="foo", p2="bar"):
print('{0},{1}'.format(p1, p2))
Run Code Online (Sandbox Code Playgroud)
让我迭代一下当我们以不同方式使用该函数时会发生什么:
>>> alpha()
foo,bar
>>> alpha("FOO")
FOO,bar
>>> alpha(p2="BAR")
foo,BAR
>>> alpha(p1="FOO", p2=None)
FOO,None
Run Code Online (Sandbox Code Playgroud)
现在考虑我想要调用它的情况,alpha("FOO", myp2)并且myp2将包含要传递的值,或者是None.但即使该函数处理p2=None,我希望它使用其默认值"bar".
也许这令人困惑,所以让我改写一下:
如果
myp2 is None,打电话alpha("FOO").不用了,打电话alpha("FOO", myp2).
区别是相关的,因为alpha("FOO", None)结果不同alpha("FOO").
我如何简洁(但可读)做出这种区分?
一种可能性通常是在内部检查无alpha,这将被鼓励,因为这将使代码更安全.但是假设alpha它实际上应该在其他地方使用,None就像它一样.
我想在来电方面处理这个问题.
一种可能性是区分案例:
if myp2 is None:
alpha("FOO")
else:
alpha("FOO", myp2)
Run Code Online (Sandbox Code Playgroud)
但是,当有多个这样的论点时,这很快就会成为很多代码.(指数,2 ^ n)
另一种可能性是简单地做alpha("FOO", myp2 or "bar"),但这需要我们知道默认值.通常,我可能会采用这种方法,但我可能稍后更改默认值, …