将一长串常量导入到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
请注意,如上所述, A
, B
和C
是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,那么标准的方法是使用不可变的字典。 不幸的是,它不是内置的,所以你必须使用第三方食谱(比如这个或那个 )。