【问题标题】:Importing a long list of constants to a Python file将一长串常量导入 Python 文件
【发布时间】:2011-09-14 15:49:51
【问题描述】:

在 Python 中,是否有类似 C 预处理器语句的语句,例如?:

#define MY_CONSTANT 50

另外,我有一大串常量我想导入到几个类中。是否有类似在.py 文件中将常量声明为类似上述语句的长序列并将其导入另一个.py 文件的类似物?

编辑。

文件Constants.py 内容如下:

#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

myExample.py 写着:

#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""

import sys
import os

import Constants

class myExample:
    def __init__(self):
        self.someValueOne = Constants.MY_CONSTANT_ONE + 1
        self.someValueTwo = Constants.MY_CONSTANT_TWO + 1

if __name__ == '__main__':
    x = MyClass()

编辑。

来自编译器,

NameError: "全局名称 'MY_CONSTANT_ONE' 未定义"

function init in myExample at line 13 self.someValueOne = 常量.MY_CONSTANT_ONE + 1 份 输出程序以代码 #1 退出 0.06 秒后。

【问题讨论】:

  • 不,没有预处理器。不,你不会在 Python 中编写 C 代码,甚至试图找到相似之处。
  • 这不是完整的追溯。你是如何运行它的? python myExample.py 应该提供包含文件名和 <module> 作为顶层的错误的回溯。另外,MY_CONSTANT_ONE 不是 引用作为全局名称 - 真的很奇怪。三重检查这些确实是您正在运行的文件(也许将它们转换为 ASCII 并去除 # encoding: utf8 位)。
  • @All:谢谢,我现在似乎很好 - 还不知道为什么,但没关系:)。

标签: python constants python-import


【解决方案1】:

Python 没有经过预处理。你可以创建一个文件myconstants.py:

MY_CONSTANT = 50

导入它们就可以了:

import myconstants
print myconstants.MY_CONSTANT * 2

【讨论】:

  • @SK9:好吧,显示您正在运行的确切代码(定义和使用模块)。
  • @Thomas:见上文。我在学习基础知识时肯定错过了一些愚蠢的东西。
  • @SK9:您发布的代码中没有此类错误。我检查了几次并自己运行它,它工作得很好。它不能甚至导致这个错误(没有引用名称MAX_FIVE_FLUSH_KEY_INT)。发布回溯。
  • @Thomas:感谢您对此进行测试。嗯,我再试试。 (提到的参考是一个错字。)您按原样尝试了这些文件? (我复制并粘贴了上面的全部内容。)
  • @SK9:我不是 Thomas ;) 是的,我复制并粘贴了所有内容,我什至保留了文件名原样。再次,回溯将帮助我们调试。
【解决方案2】:

Python 没有预处理器,也没有无法更改的常量——你总是可以改变(几乎,你可以模拟常量对象属性,但这样做是为了常量—— ness 很少完成并且不被认为是有用的)一切。在定义一个常量时,我​​们定义了一个大写加下划线的名称,然后就结束了——“我们都是在这里同意的成年人”,没有理智的人会改变一个常量。当然,除非他有充分的理由并且确切地知道他在做什么,在这种情况下,你不能(而且可能不应该)以任何方式阻止他。

当然你可以用一个值定义一个模块级的名字,然后在另一个模块中使用它。这不是特定于常量或任何东西,请阅读模块系统。

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

【讨论】:

    【解决方案3】:

    当然你也可以这样做:

    # a.py
    MY_CONSTANT = ...
    
    # b.py
    from a import *
    print MY_CONSTANT
    

    【讨论】:

    • import * 通常不鼓励使用,但在代码库中广泛使用的 C 样式清单常量是使用它的地方之一。将它们命名为 ALL_CAPS 或使用一些前缀约定来减少与其他符号冲突的可能性,消除了对惯用语的主要反对意见,如果确实发生冲突,您总是可以回退到传统的导入 + 显式名称样式(import a; a .MY_CONSTNAT),与 C 不同。
    • a.MY_CONSTNAT 也慢了一点,这是因为解释器在一个命名空间中查找名称“a”,然后在第二个名称空间中查找名称“MY_CONSTNAT”
    【解决方案4】:

    当然,您可以将常量放入单独的模块中。例如:

    const.py:

    A = 12
    B = 'abc'
    C = 1.2
    

    main.py:

    import const
    
    print const.A, const.B, const.C
    

    请注意,如上所述,ABC 是变量,即可以在运行时更改。

    【讨论】:

      【解决方案5】:

      作为使用多个答案中描述的导入方法的替代方法,请查看configparser 模块。

      ConfigParser 类实现了一种基本的配置文件解析器语言,它提供的结构类似于您在 Microsoft Windows INI 文件中可以找到的结构。您可以使用它来编写最终用户可以轻松自定义的 Python 程序。

      【讨论】:

        【解决方案6】:

        试着看Create constants using a "settings" module?Can I prevent modifying an object in Python?

        另一个有用的链接:http://code.activestate.com/recipes/65207-constants-in-python/ 告诉我们以下选项:

        from copy import deepcopy
        
        class const(object):
        
            def __setattr__(self, name, value):
                if self.__dict__.has_key(name):
                    print 'NO WAY this is a const' # put here anything you want(throw exc and etc)
                    return deepcopy(self.__dict__[name])
                self.__dict__[name] = value
        
            def __getattr__(self, name, value):
                if self.__dict__.has_key(name):
                    return deepcopy(self.__dict__[name])
        
            def __delattr__(self, item):
                if self.__dict__.has_key(item):
                    print 'NOOOOO' # throw exception if needed
        
        CONST = const()
        CONST.Constant1 = 111
        CONST.Constant1 = 12
        print a.Constant1 # 111
        CONST.Constant2 = 'tst'
        CONST.Constant2 = 'tst1'
        print a.Constant2 # 'tst'
        

        所以你可以创建一个这样的类,然后从你的 contants.py 模块中导入它。这将允许您确保该值不会被更改、删除。

        【讨论】:

        • 谢谢。在询问之前,我搜索并找到了这两个。 :)
        • @SK9 哦,抱歉重复了
        【解决方案7】:

        创建具有任何名称的常量文件,例如 my_constants.py 像这样声明常量

        CONSTANT_NAME = "SOME VALUE"
        

        像这样访问代码导入文件中的常量

        import my_constants as constant
        

        并将常量值访问为 -

        constant.CONSTANT_NAME
        

        【讨论】:

          【解决方案8】:

          如果您真的想要常量,而不仅仅是看起来像常量的变量,那么标准的做法是使用不可变字典。不幸的是它还没有内置,所以你必须使用第三方食谱(如this onethat one)。

          【讨论】:

            【解决方案9】:

            在商业软件中,常量会经常被深埋很多文件夹。将以下解决方案与上述解决方案结合使用以获得最佳效果。这是对我有用的语法:

            folder_a
                folder_b
                    constants.py
            # -----------
            # constants.py
            # ------------
            MAXVAL = 1000
            
            folder_c
                folder_d
                    my_file.py
            
            # ------------------------
            # my_file.py
            # ------------------------
            import folder_a.folder_b.constants as consts
            
            print(consts.MAXVAL)
            

            【讨论】:

              【解决方案10】:

              您创建一个常量 def / 函数并在任何 python 脚本/不同文件中调用它。 尝试 def 并设置一个值

              【讨论】:

              猜你喜欢
              • 2013-02-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-04-17
              • 1970-01-01
              相关资源
              最近更新 更多