Вы можете также рассмотреть некоторые другие способы сохранения данных. В своем собственном (астрономическом) исследовании я экспериментировал с двумя различными способами хранения сценариев для воспроизводимости. Во-первых, они должны быть размещены исключительно в хранилище Subversion, а затем сценарий отправки задания автоматически фиксирует их. Например, если вы просто хотели сделать это в bash:
alias run_py='svn ci -m "Commit before running"; python2.5 $*'
и внутри скрипта, для выходного файла будет указан префикс текущей версии подрывной версии для этого файла, у вас будет запись каждого скрипта, который был запущен, и ввод. Вы можете вытащить это обратно из Subversion, если потребуется.
Другим, существенно менее полнофункциональным, средством отслеживания ввода в функцию может быть что-то вроде LodgeIt , вставка, которая принимает ввод XML-RPC и поставляется с привязками Python. (Он может быть установлен локально и имеет поддержку для ответа и обновления существующих паст.)
Но, если вы ищете относительно небольшой объем кода для включения, решение Vinko, использующее inspect, должно работать достаточно хорошо. Даг Хеллман рассказал о inspect
модуле в своей серии Python Module of Week . Вы можете создать декоратор, который проверяет каждый параметр и аргумент, а затем распечатывает их соответствующим образом (я буду использовать inspect.getargspec
, чтобы получить имена аргументов.)
import inspect
from functools import wraps
def option_printer(func):
@wraps(func)
def run_func(*args, **kwargs):
for name, arg in zip(inspect.getargspec(func)[0], args) \
+ sorted(kwargs.items()):
if isinstance(arg, types.FunctionType):
print "Function argument '%s' named '%s':\n" % (name, func.func_name)
print inspect.getsource(func)
else:
print "%s: %s" % (name, arg)
return func(*args, **kwargs)
return run_func
Возможно, это можно сделать немного более элегантно, но в моих тестах это работает для простых наборов аргументов и переменных. Кроме того, могут возникнуть проблемы с лямбдами.