使用 Python 中已提供的参数创建一个可调用对象
Create a callable object with arguments already supplied in Python
本质上,我试图将参数传递给一个函数,但将该函数的执行推迟到以后。我不想延迟一些时间,否则我会 sleep
。这是我想要的用法
import requests
def test_for_active_server(server_address):
response = requests.get(server_address)
try_n_times(func, expected_error, n_iterations):
for i in range(n_iterations):
try:
func()
break
except expected_error:
continue
else:
return False
return True
try_n_times(
create_callable(test_for_active_server("http://localhost/"),
requests.ConnectionError, 10)
这里的问题当然是当我调用 test_for_active_server("http://localhost/")
时它会立即 运行 所以 create_callable
的参数将只是 None
。我相信我可以用
这样的东西来做到这一点
def create_callable(func, func_args: List[str], func_kwargs: Dict[str, str], *args):
def func_runner():
func(*args, *func_args, **func_kwargs)
return func_runner
然后用作
create_callable(test_for_active_server, "http://localhost")
但这有点尴尬。有更好的方法吗?
您正在寻找 functools.partial
。
您可以提供所有参数,因此您可以执行以下操作:
obj = functools.partial(test_for_active_server, server_address="http://localhost/")
# ...do other things...
obj()
本质上,我试图将参数传递给一个函数,但将该函数的执行推迟到以后。我不想延迟一些时间,否则我会 sleep
。这是我想要的用法
import requests
def test_for_active_server(server_address):
response = requests.get(server_address)
try_n_times(func, expected_error, n_iterations):
for i in range(n_iterations):
try:
func()
break
except expected_error:
continue
else:
return False
return True
try_n_times(
create_callable(test_for_active_server("http://localhost/"),
requests.ConnectionError, 10)
这里的问题当然是当我调用 test_for_active_server("http://localhost/")
时它会立即 运行 所以 create_callable
的参数将只是 None
。我相信我可以用
def create_callable(func, func_args: List[str], func_kwargs: Dict[str, str], *args):
def func_runner():
func(*args, *func_args, **func_kwargs)
return func_runner
然后用作
create_callable(test_for_active_server, "http://localhost")
但这有点尴尬。有更好的方法吗?
您正在寻找 functools.partial
。
您可以提供所有参数,因此您可以执行以下操作:
obj = functools.partial(test_for_active_server, server_address="http://localhost/")
# ...do other things...
obj()