将一长串常量导入到Python文件


90

在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”

myExample中第13行的函数init self.someValueOne = Constants.MY_CONSTANT_ONE + 1个副本输出0.06秒后,程序以代码#1退出。


2
不,没有预处理器。不,您不会尝试使用Python编写C语言,甚至不会尝试找到并行。

那不是完整的追溯。您如何运行它?python myExample.py应该对包含文件名和<module>顶级错误的错误进行回溯。另外,MY_CONSTANT_ONE 不是引用作为全局名称-真的很奇怪。仔细检查这些文件是否确实是您正在运行的文件(也许将它们转换为ASCII并去除# encoding: utf8位)。

@All:谢谢,我现在似乎还不错-不确定为什么,但没关系:)。
SK9

Answers:


131

Python未经过预处理。您可以只创建一个文件myconstants.py

MY_CONSTANT = 50

导入它们就可以了:

import myconstants
print myconstants.MY_CONSTANT * 2

@ SK9:好吧,显示您正在运行的确切代码(定义和使用模块)。

@托马斯:见上文。在学习基础知识的过程中,我肯定错过了一些愚蠢的东西。
SK9

@ SK9:您发布的代码中没有此类错误。我检查了几次,然后自己运行,一切正常。它甚至都不会导致此错误(没有引用name MAX_FIVE_FLUSH_KEY_INT)。发布追溯。

@Thomas:感谢您对此进行测试。嗯,我再试一次。(所引用的参考文献是错字。)您是否按原样尝试了这些文件?(我复制并粘贴了上面的全部内容。)
SK9

@ SK9:我不是Thomas;)是的,我复制并粘贴了所有内容,甚至保留了文件名。同样,回溯将帮助我们进行调试。

18

Python没有预处理器,也没有常量,就不能更改它们-您可以随时更改(几乎可以仿真常量对象属性,但是很少因为常量而这么做)完成并且不被认为有用)一切。当定义一个常量时,我​​们定义一个带下划线的大写名称,并将其命名为一天-“我们都同意这里的成年人”,没有理智的人会更改常量。除非他当然有充分的理由,并且确切地知道他在做什么,否则您就无法(而且应该不应该)阻止他。

但是,当然可以定义一个带有值的模块级名称,然后在另一个模块中使用它。这不是常量或任何东西专用的,请在模块系统上阅读。

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

11

当然,您可以执行以下操作:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


3
通常不建议使用import *,但是在代码库中广泛使用的C样式清单常量是使用它的明智之选之一。使用ALL_CAPS或使用一些前缀约定来命名它们可以减少与其他符号发生冲突的可能性,从而消除了对该惯用语的主要反对,并且如果发生冲突,您可以始终使用常规的import +显式名称样式(import a; a .MY_CONSTNAT),不像在C.
拉塞尔Borogove

a.MY_CONSTNAT也稍慢一点,这是因为解释器在一个名称空间中查找名称“ a”,然后在第二个敌人名称中查找“ MY_CONSTNAT”
Tony,

7

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

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

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

需要注意的是如上声明AB并且C是变量,即可以在运行时改变。


5

尝试查看使用“设置”模块创建常量?并且可以防止在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模块中将其导入。这将使您确保该值不会被更改,删除。


谢谢你 在询问SO之前,我进行了搜索并找到了这两者。:)
SK9

@ SK9哦,对不起,对不起,这对重复
Artioim Rudzenka 2011年

4

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

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


2

如果您真的想要常量,而不仅仅是看起来像常量的变量,则标准方法是使用不可变字典。遗憾的是它没有内置然而,所以你必须使用第三方的食谱(像这一个那一个)。


2

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

CONSTANT_NAME = "SOME VALUE"

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

import my_constants as constant

并将常量值访问为-

constant.CONSTANT_NAME
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.