如何在Python中获取传入函数的参数的参数名?

如何在Python中获取传入函数的参数的参数名?,python,Python,我正在制作一个装饰器,它在调用函数时打印出函数的输入和输出值。我想知道如何获得传入函数的参数的参数名。在下面的示例函数中,我希望第一个参数-5是参数“乘数”,其余参数是参数“*numbers”,但是我如何将这些信息传递到decorator中,因为decorator中的f函数只有**args和**kwargs作为参数,而不是函数的实际参数名?希望你们能帮助我,非常感谢 这是装饰师: def log(with_input=True): def inner(f): def wr

我正在制作一个装饰器,它在调用函数时打印出函数的输入和输出值。我想知道如何获得传入函数的参数的参数名。在下面的示例函数中,我希望第一个参数-5是参数“乘数”,其余参数是参数“*numbers”,但是我如何将这些信息传递到decorator中,因为decorator中的f函数只有**args和**kwargs作为参数,而不是函数的实际参数名?希望你们能帮助我,非常感谢

这是装饰师:

def log(with_input=True):
    def inner(f):
        def wrapper(*args, **kwargs):
            rv = f(*args, **kwargs)
            print('*' * 40)
            print("function: ", f.__name__,inspect.signature(f))
            if with_input:
                print("input: ")
                for arg in args:
                    print('  param_name',arg)
            print("output:", rv)
            return rv
        return wrapper
    return inner
@log(with_input=True)
def multiplier_sum(multiplier,*numbers):
   sum = 0
   for n in numbers:
       sum += n
   return sum * multiplier

multiplier_sum(5,2,3,4) 
这是测试装饰器的示例代码:

def log(with_input=True):
    def inner(f):
        def wrapper(*args, **kwargs):
            rv = f(*args, **kwargs)
            print('*' * 40)
            print("function: ", f.__name__,inspect.signature(f))
            if with_input:
                print("input: ")
                for arg in args:
                    print('  param_name',arg)
            print("output:", rv)
            return rv
        return wrapper
    return inner
@log(with_input=True)
def multiplier_sum(multiplier,*numbers):
   sum = 0
   for n in numbers:
       sum += n
   return sum * multiplier

multiplier_sum(5,2,3,4) 
这是输出,其中与参数关联的参数名是我希望用来代替param_name的:

****************************************
function:  multiplier_sum (multiplier, *numbers)
input: 
  param_name 5
  param_name 2
  param_name 3
  param_name 4
output: 45
这将给出参数名称

function.__code__.co_argcount
这将给出参数计数


很酷的问题。这里有一个解决方案:

import inspect

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("signature: ", inspect.signature(func))
        bound_sig = inspect.signature(func).bind(*args, **kwargs)
        print("bound signature: ", bound_sig)
        print("arguments: ", bound_sig.arguments)
        func(*args, **kwargs)
    return wrapper

@my_decorator
def f(x):
    print (f"we're in foo now, and x is {x}")

f(5)
结果:

signature:  (x)
bound signature:  <BoundArguments (x=5)>
arguments:  OrderedDict([('x', 5)])
we' re in foo now, and x is 5
签名:(x)
装订签名:
参数:OrderedDict([('x',5)])
我们现在在福,x是5

请将您的代码发布到您的问题中,而不是将您的代码截图复制/粘贴到问题中。有关更多信息,请参阅。这是否回答了您的问题?我的意思是如何知道每个参数属于哪个参数?@khaitroong922您知道argcount。您可以继续为它赋值,除非您完成。谢谢。请随意接受它作为子孙后代的答案:)