我一直在学习 Ruby 元编程,发现它非常有用。我确信我可以在 Python 中做同样的事情。
例如:如何使用元编程以简洁和通用的方式重写给定此函数的函数?
def foo(bar=None, baz=None, qux=None, haz=None):
txt = {}
if bar:
txt.update({'bar': bar})
if baz:
txt.update({'baz': baz})
if qux:
txt.update({'qux': qux})
if haz:
txt.update({'haz': haz})
return txt
(这显然过于简单了,在实践中,人们可能会根据各个键的值集执行不同的任务)
最佳答案
你可以使用 **kwargs
语法:
def foo(**kwargs):
txt = {}
for k, v in kwargs.items():
if v:
txt[k] = v
return txt
或者,如果您的墨水不足:
def foo(**kwargs):
return dict(((k,v) for k, v in kwargs.items() if v))
正如 Clement Bellot 所建议的:
如果您想确保这些参数在您预期的集合中,您可以使用 ALLOWED_PARAMS = ('bar','baz','qux','haz')
常量并替换if v
with if v and k in ALLOWED_PARAMS
.
根据 DSM 的建议:
如果您运行的是 Python 2.7+,则可以使用 dict comprehension .
这个版本还提供了另一种解决“允许变量”问题的方法:
def foo(bar=None, baz=None, qux=None, haz=None):
return {k:v for k,v in locals().items() if v}
假设您实际上想根据这些参数调用函数,您可以这样做:
KWARGS_TO_FUNCTIONS = {
'bar':fn_bar,
'baz':fn_baz,
'qux':fn_qux,
'haz':fn_haz,
}
def foo(**kwargs):
for k, v in kwargs.items():
if v:
try:
KWARGS_TO_FUNCTIONS[k](v)
except KeyError:
pass # We didn't want that kwarg.
现在,总而言之,我不确定这是否真的是“元”。
关于python - 基本 Python 元编程 : populating dictionaries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114571/