python - 基本 Python 元编程 : populating dictionaries?

标签 python exception dictionary metaprogramming conditional-statements

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

相关文章:

java - Java HashMap对象的并发访问

json - Golang map : How to strip out empty fields automatically

python - 使用 SciPy/NumPy 循环有限概率权重

python - Tensorflow 模块导入错误 : AttributeError: module 'tensorflow.python.ops.nn' has no attribute 'rnn_cell'

python - 从具有相似名称的列中提取最大值

c++ - 抛出 C++ 异常时在调试器中中断程序

python - 在 matplotlib 中的嵌套字典的数据上创建图形(绘图)

python - python 3.6.5 中的 pygame 中没有显示图像

java.lang.IllegalAccessError : tried to access method

java - Java异常中的HTTP代码