在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秒后。
答案 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
请注意,如上所述,A
,B
和C
是变量,即可以在运行时更改。
答案 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)
答案 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)