使用できます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
これらの値が事前にないため、またはを使用することはできません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前処理を試してみてください。ただし、あなたの場合は、関数呼び出しを繰り返すだけです。