您可以使用functools.partial
>>> from functools import partial
>>> def my_function(a,b,c,d,e):
... print (a,b,c,d,e)
...
>>> func_with_defaults = partial(my_function, 1, 2, e=5)
>>> func_with_defaults(3, 4)
(1, 2, 3, 4, 5)
编辑:
由于您事先没有这些值,因此您不能使用partial
or lambda
。您可能很想这样做:
>>> A = lambda x: x + y
>>> def do_something(y):
... return A(2) # hope it uses the `y` parameter...
...
>>> do_something(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in do_something
File "<stdin>", line 1, in <lambda>
NameError: global name 'y' is not defined
但正如你所见,它不起作用。为什么?因为当您定义一个函数时,python 会保存您定义它的范围并使用它来解析global
/nonlocal
变量。
如果您可以访问some_func
它,则可以通过使用“破解”解释器堆栈来做您想做的inspect
事情,但这不是一个健壮或优雅的事情,所以不要这样做。
在您的情况下,我要做的就是简单地重写该语句。
如果你真的想避免这种情况,你可以尝试使用exec
:
>>> def some_function(a,b,c):
... print(a,b,c)
...
>>> code = 'some_function(a+b,c,%s)'
>>>
>>> def func_one(a,b, c):
... exec code % 1
...
>>> def func_two(a,b,c):
... exec code % 2
...
>>> func_one(1,2,3)
(3, 3, 1)
>>> func_two(1,2,3)
(3, 3, 2)
但这很丑陋。
如果您只对函数使用位置参数,您可以做一些更优雅的事情,例如:
>>> def compute_values(a,b,c):
... return (a+b, c)
...
>>> def func_one(a,b,c):
... some_function(*(compute_values(a,b,c) + (1,)))
...
>>> def func_two(a,b,c):
... some_function(*(compute_values(a,b,c) + (2,)))
...
>>> func_one(1,2,3)
(3, 3, 1)
>>> func_two(1,2,3)
(3, 3, 2)
但是此时您只是在重复不同的文本,并且您失去了很多可读性。如果您想在 python 中具有预处理功能,您可以尝试Python Preprocessing,即使在您的情况下,我宁愿只是重复函数调用。