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

在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'未定义”

函数init在myExample的第13行self.someValueOne = Constants.MY_CONSTANT_ONE + 1复制输出在0.06秒后用代码#1退出的程序。

Python不是预处理的。 你可以创build一个文件myconstants.py

 MY_CONSTANT = 50 

导入它们只会工作:

 import myconstants print myconstants.MY_CONSTANT * 2 

Python没有一个预处理器,也没有它们不能被改变的常量 – 你可以随时改变(几乎可以模拟常量对象的属性,但为了恒定性这么做很less见完成,不被认为是有用的)一切。 当定义一个常数时,我们定义一个大写字母的名字,并称之为一天 – “我们都在这里同意大人”,没有一个理智的人会改变常数。 除非他有很好的理由,并且确切地知道他在做什么,在这种情况下,你不能(也不应该)阻止他。

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

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

当然,你可以把你的常量放到一个单独的模块中。 例如:

const.py:

 A = 12 B = 'abc' C = 1.2 

main.py:

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

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

当然,你可以这样做:

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

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

ConfigParser类实现了一个基本的configuration文件parsing器语言,它提供了一个类似于您在Microsoft Windows INI文件中find的结构。 您可以使用它来编写可以由最终用户轻松自定义的Python程序。

尝试使用“设置”模块查看创build常量? 和我可以防止修改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' 

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

如果你真的需要常量,而不仅仅是看起来像常量的variables,那么标准的方法是使用不可变的字典。 不幸的是,它不是内置的,所以你必须使用第三方食谱(比如这个或那个 )。