Skip to main content
 首页 » 编程设计

python之基本 Python 元编程 : populating dictionaries

2025年05月04日13hnrainll

我一直在学习 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. 

现在,总而言之,我不确定这是否真的是“元”。