【问题标题】:Is it a good idea to dynamically create variables?动态创建变量是个好主意吗?
【发布时间】:2016-05-29 06:35:32
【问题描述】:

我最近发现了如何通过这个方法在python中动态创建变量:

vars()['my_variable'] = 'Some Value'

从而创建变量my_variable

我的问题是,这是个好主意吗?还是我应该总是提前声明变量?

【问题讨论】:

  • 不,不。​​​​​​​​为什么不直接my_variable = 'Some Value'呢?
  • 如果需要动态命名,请使用dicts。
  • 仅仅因为您可以利用变量 nanespace 并不意味着您应该这样做。您可以使用这些函数覆盖 anything
  • 我正要写一个很长的答案,关于这种动态命名如何使机器和人类,甚至原作者更难编写正确的代码,但本质上,如果 OP 只是使用 dicts对于所有事情,这将是同样的问题。 (哎呀,我们可以从问题中的提示推断出 Python 已经在使用 dicts 来处理所有事情。)所以我不会愉快地回答这个问题。但我会说人类作者应该努力提高可读性。
  • 原则上是没有问题的。尽管这会使您的代码更难阅读,但这违反了“最佳实践”约定。尽管如此,如果您可以证明编写两倍的代码是合理的,那么我不明白您为什么不应该这样做。请注意,通过my_var = my_value 创建变量是相同的,并且调用相同的函数,但它需要“更长”,因为它是隐式的。更长 = 纳秒更长!虽然如果有 1e9 纳秒可以变成秒。再说一次,优化是一个因素吗?如果是这样,您也可以尝试ctypes 或numpy ctype 实现,它们相对更优雅。

标签: python variables python-3.5 dynamic-variables


【解决方案1】:

优点:

  • 增加了另一层间接性,使环境更加动态
    • 尤其是可以避免更多的代码重复

缺点:

  • 不适用于函数命名空间(由于优化)
  • 增加了另一个层次的间接性,使环境更加动态
    • “词法引用”更难跟踪和维护
      • 如果创建的名称是任意的,则等待发生冲突
      • 很难在代码库中找出来龙去脉并预测其行为
      • 这就是为什么这些技巧可能会扰乱代码检查工具,例如pylint
  • 如果变量以类似的方式处理,它们可能与其他变量分开(在专用的dict 中)而不是重用命名空间字典,从而使过程变得一团糟

简而言之,在 Python 的语言和运行时功能设计的抽象级别上,它只有在定义明确的少量时才有用。

【讨论】:

    【解决方案2】:

    不保证vars()['myvariable'] = 'Some value'my variable = 'Some value' 具有相同的效果。来自documentation

    没有参数,vars() 就像 locals()。注意,当地人 字典仅对读取有用,因为对本地人的更新 字典被忽略。

    这段代码完全是错误的。

    【讨论】:

      【解决方案3】:

      如果可能的话,我认为最好使用字典:

      vars_dict = {}
      vars_dict["my_variable"] = 'Some Value'
      vars_dict["my_variable2"] = 'Some Value'
      

      我认为它更 Pythonic。

      【讨论】:

      • 使用字典字面量构建字典更符合 Python 风格。尤其是空字典。
      • vars_dict = { 'my_variable': 'Some Value', 'my_variable2': 'Some Value' }?
      • @kojiro 这个想法是动态地提供字典
      • 只是一个小的最佳实践,点。最好将空变量定义为文字。换句话说,vars_dict = dict() 优于 vars_dict = {}。我并不是说后者是错误的。我只是说前者更明确,更容易理解。
      【解决方案4】:

      这是一个坏主意,因为分析代码变得更加困难,无论是对于查看源代码的人,还是对于 pylint 或 pychecker 等工具。如果您使用这样的技巧,您将更有可能引入错误。如果您认为您在某个时候需要该功能,请认真考虑是否可以以更简单和更传统的方式解决您的问题。我已经使用 Python 将近 20 年了,从来没有觉得有必要这样做。

      如果您有更多动态需求,只需使用普通字典,或者可能是 json 之类的东西。

      Python 的一大优点是其动态特性和良好的标准集合类型,您可以避免将逻辑放入文本字​​符串中。 Python 解释器、IDE 中的语法突出显示、智能感知和代码分析工具都会查看您的源代码,提供有用的建议并发现错误和弱点。如果您的数据结构或逻辑已隐藏在文本字符串中,这将不起作用。

      更愚蠢和死板的语言,如 C++ 和 Java,通常使开发人员求助于基于字符串的数据结构,如 XML 或 json,因为它们没有方便的集合,如 Python 列表或字典。这意味着您对编译器和语言或工具中内置的其他安全检查隐藏了业务逻辑,并且必须进行大量检查,否则您的开发工具会为您完成这些检查。在 Python 中,您不必这样做……所以不要这样做!

      【讨论】:

        【解决方案5】:

        我看不出它有什么好处,也会使您的代码更难理解。 所以不,我认为这不是一个好主意。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-14
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          • 2021-11-12
          相关资源
          最近更新 更多