我需要给出一个自动构造的方法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()等时最好让签名正确。有什么方法可以做到这一点吗?
答案 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.