代码之家  ›  专栏  ›  技术社区  ›  Salvatore

在Python中打印函数参数名称和值

  •  -1
  • Salvatore  · 技术社区  · 5 年前

    >>> def foo(bar, baz):
    >>>    magic_parameter_printing() 
    bar=0, baz=None
    

    现在我使用格式:

    print("bar={},baz={}".format(bar,baz))
    

    但随着新参数的加入,这是一种痛苦,而且总有遗漏某些内容的风险。

    我发现 this 当你知道单变量是什么(以及它们的用途)时,回答哪一个对它们有效 eval ),但我真的希望能够为函数传递的所有参数都这样做。

    2 回复  |  直到 5 年前
        1
  •  2
  •   Olvin Roght user11553057    5 年前

    在你解释了如何应用这个之后,我认为最好的方法是使用 decorator . 它是一个更通用的解决方案,因为您可以将它添加到代码中的任何函数中,并且如果启用调试模式,它将打印所有调试信息。

    from functools import wraps
    
    DEBUG = True
    
    def debug_log(function):
        @wraps(function)
        def wrapper(*args, **kwargs):
            if DEBUG:
                print(">> Called", function.__name__, "\n",
                    {**dict(zip(function.__code__.co_varnames, args)), **kwargs})
            result = function(*args, **kwargs)
            if DEBUG:
                print(">>", function.__name__, "return:\n", result)
            return result
        return wrapper
    
    @debug_log
    def first_example(a, b, c):
        return 100
    
    @debug_log
    def second_example(d, e, f):
        return 200
    
    first_example(10, 11, 12)
    first_example(c=12, a=10, b=11)
    second_example(13, 14, 15)
    second_example(e=14, d=13, f=15)
    DEBUG = False
    first_example(0, 0, 0)
    second_example(1, 1, 1)
    

    输出:

    >> Called first_example 
     {'a': 10, 'b': 11, 'c': 12}
    >> first_example return:
     100
    >> Called first_example 
     {'c': 12, 'a': 10, 'b': 11}
    >> first_example return:
     100
    >> Called second_example 
     {'d': 13, 'e': 14, 'f': 15}
    >> second_example return:
     200
    >> Called second_example 
     {'e': 14, 'd': 13, 'f': 15}
    >> second_example return:
     200
    
        2
  •  1
  •   MrNobody33 Olufemi    5 年前

    你可以试着用 func.__code__.co_varnames

    def foo(bar, baz):
        magic_parameter_printing() 
    
    bar=0
    baz=None  
    for var in foo.__code__.co_varnames:
        print(var,'= ',eval(var))
    

    输出:

    bar=0
    baz=None