在运行时创建的方法中设置参数名称和默认值

时间:2011-04-06 00:05:38

标签: python

我需要给出一个自动构造的方法position和default参数。如果我不关心参数名称或默认值,我会使用* args和** kwargs。这是我正在尝试做的一个例子(请注意

def make_method(params):
    # Create method that's parameters are defined in params.
    return method

params = {'param1': 'default_value', 'param2': None}
method = make_method(params)

对于每个非None值,我想在方法中创建一个位置参数,并为每个None值创建一个默认参数。

问题是我不知道如何在运行时设置参数名称和默认值。我不想使用* args和** kwars作为方法,因为在使用help()等时最好让签名正确。有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

这是一个黑客!此外,我不确定我是否理解如何根据您的要求生成kwargs。但这是一个开始。虽然,我不确定这是一个好的开始:)

def make_method(params):
    def impl(*args, **kwargs):
        # do stuff with args & kwargs
        print "I was called with {args} and {kwargs}".format(
            args=args,
            kwargs=kwargs)
        pass
    name = 'some_name'
    scope = dict(__impl=impl)
    exec """\
def {name}({pos_arg_defs}):
    'Very helpful function.'
    return __impl({pos_arg_names})
""".format(name=name,
           pos_arg_defs=', '.join('='.join((k, repr(v)))
                                  for k, v in params.iteritems()
                                  if v is not None),
           pos_arg_names=', '.join(k
                                   for k, v in params.iteritems()
                                   if v is not None)) in scope
    return scope[name]

这是一些REPL输出:

>>> help(make_method(dict(foo=42, bar=None, zomg='abc')))
Help on function some_name:

some_name(zomg='abc', foo=42)
    Very helpful function.