(Python) 如何打印偏函数的函数名

问题描述 投票:0回答:2

我正在运行一个进程,我将失败的函数添加到列表中以便稍后重试。我为此使用部分。现在我想打印正在重试的功能。

示例代码:

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
   

我怎样才能改变我的代码来产生想要的结果?

我尝试打印示例代码,但它只是给出了一个指向函数对象的指针。

python partial functools
2个回答
0
投票

为了做到这一点,你需要制作一个自定义的部分函数来包装你的函数,然后你可以使用

__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


0
投票

您可以使用

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
和函数之外的其他可调用对象,你可以添加案例来处理它。

© www.soinside.com 2019 - 2024. All rights reserved.