我正在运行一个进程,我将失败的函数添加到列表中以便稍后重试。我为此使用部分。现在我想打印正在重试的功能。
retry_queue = []
def foo():
""" Try and run function_a """
result = function_a()
if !result:
retry_queue.append(partial(function_a, args)
return retry_queue
# run the foo function
foo()
# retry all the failed functions
for function in retry_queue:
print("Now running function: %s", function)
function()
Wanted output:
>>> Now running function: function_a
我怎样才能改变我的代码来产生想要的结果?
我尝试打印示例代码,但它只是给出了一个指向函数对象的指针。
为了做到这一点,你需要制作一个自定义的部分函数来包装你的函数,然后你可以使用
__name__
:
from functools import partial, update_wrapper
retry_queue = []
def wrapped_partial(func, *args, **kwargs):
partial_func = partial(func, *args, **kwargs)
update_wrapper(partial_func, func)
return partial_func
def function_a(args = 1):
return None
def foo():
""" Try and run function_a """
result = function_a()
args = 1
if not result:
retry_queue.append(wrapped_partial(function_a, args))
return retry_queue
# run the foo function
foo()
# retry all the failed functions
for function in retry_queue:
print("Now running function: " + function.__name__)
function()
输出:
Now running function: function_a
您可以使用
func
属性访问原始函数。有关更多信息,请参阅docs。
如果你传递常规函数,你应该编写一个包装器来提取部分对象或“普通”函数的名称。
from functools import partial
from typing import Callable, Any
def callable_name(any_callable: Callable[..., Any]) -> str:
if isinstance(any_callable, partial):
return any_callable.func.__name__
try:
return any_callable.__name__
except AttributeError:
return str(any_callable)
现在
callable_name(print)
和callable_name(partial(print, "Hello,"))
都返回'print'
.
如果你必须支持除
partial
和函数之外的其他可调用对象,你可以添加案例来处理它。