基本的Python元编程:填充字典?

A T*_*A T 1 python conditional dictionary exception-handling metaprogramming

我一直在学习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
Run Code Online (Sandbox Code Playgroud)

(这显然过于简化,实际上可能会根据各个键的值设置执行不同的任务)

Tho*_*zco 6

您可以使用以下**kwargs语法:

def foo(**kwargs):
    txt = {}
    for k, v in kwargs.items():
        if v:
            txt[k] = v
    return txt
Run Code Online (Sandbox Code Playgroud)

或者,如果你的墨水不足:

def foo(**kwargs):
    return dict(((k,v) for k, v in kwargs.items() if v))
Run Code Online (Sandbox Code Playgroud)

正如Clement Bellot所说:

如果你想确定那些args在你预期的集合中,你可以有一个ALLOWED_PARAMS = ('bar','baz','qux','haz')常量并替换if vif v and k in ALLOWED_PARAMS.

根据帝斯曼的建议:

如果你正在运行Python 2.7+,你可以使用dict理解.
此版本还提供了"允许变量"问题的替代方法:

def foo(bar=None, baz=None, qux=None, haz=None): 
    return {k:v for k,v in locals().items() if v}
Run Code Online (Sandbox Code Playgroud)

假设您实际上想根据那些参数调用函数,您可以这样做:

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.
Run Code Online (Sandbox Code Playgroud)

现在,总而言之,我并不完全确定这是'元'.