Python 如何在不嵌入所有容器的情况下转储和保存函数参数';什么内容?

Python 如何在不嵌入所有容器的情况下转储和保存函数参数';什么内容?,python,Python,我试图在运行时将所有函数参数保存到一个容器中。容器对于脚本中运行的所有函数都是通用的。如何确保每次保存函数参数时都不会保存所有容器的内容 下面的decorator保存函数参数: import inspect from datetime import datetime import time def func_logger(method): def wrapper(*args, **kw): method_args = inspect.signature(method).

我试图在运行时将所有函数参数保存到一个容器中。容器对于脚本中运行的所有函数都是通用的。如何确保每次保存函数参数时都不会保存所有容器的内容

下面的decorator保存函数参数:

import inspect
from datetime import datetime
import time

def func_logger(method):
    def wrapper(*args, **kw):
        method_args = inspect.signature(method).bind(*args, **kw).arguments

        runtime     = str( datetime.now() )
        name        = method.__name__
        module      = method.__module__
        signature   = runtime + ': ' + '.'.join([module, name])

        ts     = time.time()
        result = method(*args, **kw)
        te     = time.time()

        kw['log'][signature] = {}
        kw['log'][signature]['time'] = round(te - ts, 2)
        kw['log'][signature]['args'] = method_args

        return result
    return wrapper
以及一个示例函数:

@func_logger
def test(a, b=4, c='blah-blah', *args, **kwargs):
    return 4**4**8
当我运行以下代码段时:

log = {}
output = test(1,4,2,4,1,par=1, log=log)
output = test(1,4,2,4,1,par=1, log=log)

log
我收到以下输出:

{'2019-05-17 13:48:25.214094: __main__.test': {'time': 0.0,
  'args': OrderedDict([('a', 1),
               ('b', 4),
               ('c', 2),
               ('args', (4, 1)),
               ('kwargs', {'par': 1, 'log': {...}})])},
 '2019-05-17 13:48:25.215092: __main__.test': {'time': 0.0,
  'args': OrderedDict([('a', 1),
               ('b', 4),
               ('c', 2),
               ('args', (4, 1)),
               ('kwargs', {'par': 1, 'log': {...}})])}}
我已经尝试了一种变通方法——从字典中删除“log”条目的函数。但是,此日志中的每个下一项都存储日志的当前内容。因此,当我尝试这个:

list( log.items() )[-1][-1]['args']
输出如下:

OrderedDict([('a', 1),
             ('b', 4),
             ('c', 2),
             ('args', (4, 1)),
             ('kwargs',
              {'par': 1,
               'log': {'2019-05-17 13:45:45.748722: __main__.test': {'time': 0.0,
                 'args': OrderedDict([('a', 1),
                              ('b', 4),
                              ('c', 2),
                              ('args', (4, 1)),
                              ('kwargs', {'par': 1, 'log': {...}})])},
                '2019-05-17 13:45:45.749221: __main__.test': {'time': 0.0,
                 'args': OrderedDict([('a', 1),
                              ('b', 4),
                              ('c', 2),
                              ('args', (4, 1)),
                              ('kwargs', {'par': 1, 'log': {...}})])},
                '2019-05-17 13:45:45.750218: __main__.test': {'time': 0.0,
                 'args': OrderedDict(...)}}})])
因此,从本质上讲,这样的解决方法不会奏效,因为随着时间的推移,内存会很快被阻塞


是否有任何方式装饰程序不会在每次保存函数参数时保存日志条目?我希望避免的是每次我想从新函数中转储参数时都创建一个新的“log={}”容器。

您可以简单地存储log参数(如果存在)并将其从
**kw
中删除:

def func_logger(method):
    def wrapper(*args, **kw):
        try:
            log = kw['log']
            del kw['log']
        except KeyError:
            log = None

        method_args = inspect.signature(method).bind(*args, **kw).arguments

        runtime     = str( datetime.now() )
        name        = method.__name__
        module      = method.__module__
        signature   = runtime + ': ' + '.'.join([module, name])

        ts     = time.time()
        result = method(*args, **kw)
        te     = time.time()

        if log is not None:
            log[signature] = {}
            log[signature]['time'] = round(te - ts, 2)
            log[signature]['args'] = method_args

        return result
    return wrapper

func\u记录器中使用全局
log

log = {}
def func_logger(method):
    def wrapper(*args, **kw):
        # pass
        log[signature] = {...}
        return result
    return wrapper

然后,使用
output=test(1,4,2,4,1,par=1)

日志条目仍然存在于输出中,因此@Serge解决方案更完整。好吧,我误解了你的问题。:-)