没有必要。关键字参数仍然可以按位置传递。这里还有一个额外的好处,可以指定其中一个或不指定,如果您愿意的话。但是,您根本不需要指定任何内容。在>>> def foo(bar=1, baz=[2,3]):
... print bar, baz
...
>>> foo()
1 [2, 3]
>>> foo(baz=4)
1 4
>>> foo(10, 20)
10 20
如果我误解了你提供的代码,告诉我。史蒂夫的回答似乎表明你实际上在使用字符串,但我在你的帖子中没有看到任何表明这一点的东西。在
您确实提到了一个函数,它可以打印它自己的函数调用;我假设这个函数必须打印一个字符串,它看起来就像您要用传递的参数调用函数时键入的字符串一样。这相对容易做,因为您可以按原样键入函数名,也可以使用它的__name__属性。在
^{pr2}$
仔细想想,您的示例似乎缺少一个通用函数,该函数可以递归地将此行为授予任何函数。下面是一种实现这一点的方法,使用^{}s(我将重新定义foo(),这样这个例子就更有意义了):>>> from functools import partial
>>> def foo(a, b):
... return (a if not isinstance(a, partial) else a()) + (b if not isinstance(b, partial) else b())
...
>>> fun = partial(foo, 1, partial(foo, partial(foo, 2, 4), partial(foo, 3, 5)))
>>> fun()
15
>>> fun = partial(foo, 1, partial(foo, partial(foo, 2, 4), partial(foo, 3, 5)))
>>> def print_pfunc(pfunc):
... return "{}({}{}{})".format(pfunc.func.__name__, ', '.join(str(arg) if not isinstance(arg, partial) else print_pfunc(arg) for arg in pfunc.args) if pfunc.args else '', ', ' if pfunc.args and pfunc.keywords else '', ', '.join('{}={}'.format(k, v if not isinstance(v, partial) else print_pfunc(v)) for k, v in pfunc.keywords) if pfunc.keywords else '')
...
>>> print print_pfunc(fun)
foo(1, foo(foo(2, 4), foo(3, 5)))
如果你不是一个很长的format()调用的粉丝,这里有一个不同的编写方法(这样你就不用花时间解码我的垃圾了):def print_pfunc(pfunc):
args = ""
if pfunc.args is not None:
args = ', '.join(str(arg) if not isinstance(arg, partial) else print_pfunc(arg) for arg in pfunc.args)
kwargs = ""
if pfunc.keywords is not None:
kwargs = ', '.join('{}={}'.format(k, v if not isinstance(v, partial) else print_pfunc(v)) for k, v in pfunc.keywords)
return "{}({}{}{})".format(pfunc.func.__name__, args, ', ' if args and kwargs else '', kwargs)
现在,要使它适应您的代码,需要您编写代码,在对函数调用求值之前将其转换为分部。从这一点上看你想做什么-我想不出一个聪明的方法来避免这样一个事实:函数调用作为参数传递,在它们被传递之前会被求值,因为这会干扰您正在尝试的操作。在