python - 有时为参数而不是参数对象传递复杂的字典是否更好?

标签 python parameters arguments

我从事 Python 编程已经一年了,有 Java 背景,我注意到,至少在我的组织中,将复杂参数传递给函数的风格是使用字典或元组,而不是比专门参数类的实例。例如,我们有一个接受三个字典的方法,每个字典都以特定的方式构造,每个字典本身都被格式化为元组。构建参数和阅读代码对我来说很复杂。这是传递的 arg 的示例:

{'[A].X': ((DiscreteMarginalDistribution, ('red', 'blue')), ()),
 '[A].Y': ((DiscreteConditionalDistribution, ('yellow', 'green'), ('red', 'blue')),
           (IdentityAggregator('[A].X'), ))

我的问题是:

  1. 像这样传递字典/元组是一种常见的 Python 习惯用法吗?
  2. 您什么时候(如果有的话)编写 Python 代码来使用后者(参数实例)?例如,当嵌套结构超过某个复杂性阈值时。

提前致谢!

最佳答案

  • 是的,将字典传递给 Python 函数以减少参数数量是很常见的。具有适当键命名的字典式配置比仅使用元组更具可读性。

  • 我认为动态构建自定义配置类的专用实例并不常见。为此,我会坚持使用字典。如果您的配置指令和它的使用者不同步,您会得到 KeyError,这非常适合调试。

一些建议和推理:

如果您的应用程序的某些部分需要非常复杂的配置,我认为拥有一个能够正确表示当前配置的配置对象是个好主意。但是,在我的项目中,我从未最终将此类对象作为函数参数传递。这闻起来。在某些应用程序中,我有一个常量 全局配置对象,在引导过程中设置。这样的对象是全局可用的,并被视为“不可变的”。

单个函数永远不应该复杂到需要检索极其复杂的配置的程度。这表明您应该将代码分成几个部分,每个子单元都有一个相当简单的参数化。

如果函数的运行时配置比处理普通(关键字)参数的复杂性要高一些,那么传递字典是绝对常见的,可以说是“轻量级”配置对象。经过深思熟虑的关键名称选择使这种方法具有很好的可读性。当然,您也可以建立一个层次结构,以防一个级别不足以满足您的用例。

最重要的是,请注意,在许多情况下,最好的方法是使用正常的参数规范通过函数的签名显式定义函数的参数化:

def f(a, b, c, d, e):
    ...

在调用代码中,您可以在字典中为这些参数准备值:

arguments = {
    a = 1,
    b = 2,
    c = 3,
    d = 4,
    e = "x"
}

然后在函数调用时使用 Python 的语法糖进行关键字扩展:

f(**arguments)

关于python - 有时为参数而不是参数对象传递复杂的字典是否更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27381340/

相关文章:

c++ - 带 or 表达式的 If 语句中的语法错误

objective-c - 如何将字符串传递给 Objective-C 中的函数

sql-server - 在不使用存储过程的情况下将 TEXT 参数添加到 ADODB.Command

c++ - 按值传递的函数参数的常量正确性

python - Sudo scapy 不能在 virtualenv 上工作

python - 无法在 Django 中上传图片

javascript - 在 javascript 中编辑原型(prototype)方法 .push()

ruby-on-rails - 进入 Rails - 接收带参数的 get 请求并重定向它们

python - GTK:创建一个彩色的常规按钮

python - Pandas 分组 : TOP 3 values for each group