动态创建变量是个好主意吗?
Is it a good idea to dynamically create variables?
我最近发现如何通过这种方法在python中动态创建变量:
vars()['my_variable'] = 'Some Value'
从而创建变量my_variable
。
我的问题是,这是个好主意吗?还是我应该总是提前声明变量?
我看不出这样做有什么好处,也会让您的代码更难理解。
所以不,我不认为这是个好主意。
我认为如果可能的话最好使用字典:
vars_dict = {}
vars_dict["my_variable"] = 'Some Value'
vars_dict["my_variable2"] = 'Some Value'
我认为它更像 pythonic。
这是一个坏主意,因为分析代码变得更加困难,无论是对于查看源代码的人还是对于 pylint 或 pychecker 等工具。如果您使用这样的技巧,您将更有可能引入错误。如果您认为某个时候需要该功能,请认真考虑是否可以用更简单、更传统的方式解决您的问题。我已经使用 Python 将近 20 年了,从来没有觉得有必要这样做。
如果您有更多动态需求,只需使用普通词典,或者 json.
Python 的一大优点是它的动态特性和良好的标准集合类型,是您可以避免将逻辑放在文本字符串中。 Python 解释器、IDE 中的语法突出显示、智能感知和代码分析工具都会查看您的源代码,提供有用的建议并发现错误和弱点。如果您的数据结构或逻辑已隐藏在文本字符串中,这将不起作用。
更愚蠢和死板的语言,例如 C++ 和 Java,通常使开发人员求助于基于字符串的数据结构,例如 XML 或 json,因为他们没有方便的集合,如 Python 列表或字典。这意味着您向编译器和语言或工具中内置的其他安全检查隐藏了业务逻辑,并且必须进行大量的检查,否则您的开发工具会为您进行检查。在 Python 中,您不必这样做......所以不要这样做!
优点:
- 添加另一个间接级别,使环境更加动态
- 特别是,可以避免更多的代码重复
缺点:
- 不适用于函数命名空间(由于优化)
- 添加另一个间接级别,使环境更加动态
- "lexical references" 更难跟踪和维护
- 如果创建的名称是任意的,就会发生冲突
- 很难在代码库中找到来龙去脉并预测其行为
- 这就是为什么这些技巧可能会扰乱
pylint
等代码检查工具
- 如果变量以类似的方式处理,它们可能与其他变量分开(在专用的
dict
中)而不是重用名称空间字典,使过程变得一团糟
简而言之,在抽象级别 Python 的语言和运行时功能是为设计的,它只有在少量、明确定义的情况下才有用。
不保证vars()['myvariable'] = 'Some value'
和my variable = 'Some value'
的效果相同。来自 documentation:
Without an argument, vars() acts like locals(). Note, the locals
dictionary is only useful for reads since updates to the locals
dictionary are ignored.
这段代码完全错误。
我最近发现如何通过这种方法在python中动态创建变量:
vars()['my_variable'] = 'Some Value'
从而创建变量my_variable
。
我的问题是,这是个好主意吗?还是我应该总是提前声明变量?
我看不出这样做有什么好处,也会让您的代码更难理解。 所以不,我不认为这是个好主意。
我认为如果可能的话最好使用字典:
vars_dict = {}
vars_dict["my_variable"] = 'Some Value'
vars_dict["my_variable2"] = 'Some Value'
我认为它更像 pythonic。
这是一个坏主意,因为分析代码变得更加困难,无论是对于查看源代码的人还是对于 pylint 或 pychecker 等工具。如果您使用这样的技巧,您将更有可能引入错误。如果您认为某个时候需要该功能,请认真考虑是否可以用更简单、更传统的方式解决您的问题。我已经使用 Python 将近 20 年了,从来没有觉得有必要这样做。
如果您有更多动态需求,只需使用普通词典,或者 json.
Python 的一大优点是它的动态特性和良好的标准集合类型,是您可以避免将逻辑放在文本字符串中。 Python 解释器、IDE 中的语法突出显示、智能感知和代码分析工具都会查看您的源代码,提供有用的建议并发现错误和弱点。如果您的数据结构或逻辑已隐藏在文本字符串中,这将不起作用。
更愚蠢和死板的语言,例如 C++ 和 Java,通常使开发人员求助于基于字符串的数据结构,例如 XML 或 json,因为他们没有方便的集合,如 Python 列表或字典。这意味着您向编译器和语言或工具中内置的其他安全检查隐藏了业务逻辑,并且必须进行大量的检查,否则您的开发工具会为您进行检查。在 Python 中,您不必这样做......所以不要这样做!
优点:
- 添加另一个间接级别,使环境更加动态
- 特别是,可以避免更多的代码重复
缺点:
- 不适用于函数命名空间(由于优化)
- 添加另一个间接级别,使环境更加动态
- "lexical references" 更难跟踪和维护
- 如果创建的名称是任意的,就会发生冲突
- 很难在代码库中找到来龙去脉并预测其行为
- 这就是为什么这些技巧可能会扰乱
pylint
等代码检查工具
- "lexical references" 更难跟踪和维护
- 如果变量以类似的方式处理,它们可能与其他变量分开(在专用的
dict
中)而不是重用名称空间字典,使过程变得一团糟
简而言之,在抽象级别 Python 的语言和运行时功能是为设计的,它只有在少量、明确定义的情况下才有用。
不保证vars()['myvariable'] = 'Some value'
和my variable = 'Some value'
的效果相同。来自 documentation:
Without an argument, vars() acts like locals(). Note, the locals dictionary is only useful for reads since updates to the locals dictionary are ignored.
这段代码完全错误。