将一长串常量导入Python文件

时间:2011-06-14 12:17:18

标签: python constants python-import

在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中的 init 行   13 self.someValueOne =   Constants.MY_CONSTANT_ONE + 1份   输出程序退出代码#1   0.06秒后。

9 个答案:

答案 0 :(得分:83)

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

MY_CONSTANT = 50

导入它们只会起作用:

import myconstants
print myconstants.MY_CONSTANT * 2

答案 1 :(得分:14)

Python没有预处理器,也没有常量,因为它们无法更改 - 您可以随时更改(几乎可以模拟常量对象属性,但为了保持不变而这样做 - 一切都很少,并且不被认为有用。在定义一个常量时,我​​们定义一个带有下划线的大写字母,并称之为一天 - “我们都在同意这里的成年人”,没有理智的人会改变常数。当然,除非他有充分的理由并确切地知道他在做什么,在这种情况下你不能(并且不应该)阻止他。

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

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

答案 2 :(得分:8)

当然,你可以这样做:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT

答案 3 :(得分:7)

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

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

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

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

尝试查看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模块中导入它。这样可以确保不会更改,删除值。

答案 6 :(得分:2)

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

CONSTANT_NAME = "SOME VALUE"

用于访问代码导入文件中的常量

import my_constants as constant

并将常量值访问为-

constant.CONSTANT_NAME

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

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)