将一长串常量导入 Python 文件

在 Python 中,是否有类似于 C预处理器语句的代码,例如:

#define MY_CONSTANT 50

此外,我还有一个很大的常量列表,我想导入到几个类中。有没有类似的方法,在 .py文件中将常量声明为像上面那样的一长串语句,然后将其导入到另一个 .py文件中?

Edit.

The file Constants.py reads:

#!/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: “ global name 未定义“ MY _ CONSTANT _ ONE”

函数中的 Init 13 self. some ValueOne = MY _ CONSTANT _ ONE + 1 copy 输出程序退出代码 # 1 在0.06秒之后。

181532 次浏览

Python isn't preprocessed. You can just create a file myconstants.py:

MY_CONSTANT = 50

进口它们只会起作用:

import myconstants
print myconstants.MY_CONSTANT * 2

Python 没有预处理器,也没有不能改变的常量——你总是可以改变(几乎可以模拟常量对象属性,但是为了常量而这样做很少做,也不被认为是有用的)所有事情。当定义一个常量时,我们定义一个大写下划线的名字,并称之为一天——“我们在这里都是成人协议”,任何理智的人都不会改变一个常量。当然,除非他有很好的理由,并且知道自己在做什么,在这种情况下,无论如何你都不能(或许也不应该)阻止他。

当然,您可以定义一个带有值的模块级名称,并在另一个模块中使用它。这不是特定于常量或其他东西的,仔细阅读模块系统。

# a.py
MY_CONSTANT = ...


# b.py
import a
print a.MY_CONSTANT

Sure, you can put your constants into a separate module. For example:

Const.py:

A = 12
B = 'abc'
C = 1.2

Py:

import const


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

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

你当然可以这么做:

# a.py
MY_CONSTANT = ...


# b.py
from a import *
print MY_CONSTANT

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

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

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

试着看 使用“设置”模块创建常量?我可以阻止在 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 模块中导入它。这将允许您确保该值不会被更改、删除。

使用任何名称(如 my _ Constants. py)创建常量文件 像这样声明常数

CONSTANT_NAME = "SOME VALUE"

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

import my_constants as constant

并以-的形式访问常量值

constant.CONSTANT_NAME

在商业软件中,常量经常被深埋在许多文件夹中。结合使用下面的解决方案和上面的解决方案,以获得最佳效果。下面是对我有用的语法:

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)

在最近的版本中,它似乎有点挑剔。

the mode in the top answer

总部

import constants
print(token)

Constants.py enter code here令牌 = “12345”

失败了。 相反,我必须从常量中导入单个变量。

总部

from constants import token
print(token)

A constants.py file is good, but I ran into a situation where I would rather had my constants on top of the file.

类似的 Python dict 需要访问具有字符串键 dict['A']的变量,但是我需要具有与模块导入相同语法的内容。

(出于好奇,我当时正在研究 Google Collab .ipynb多个文件,每个文件都有不同的配置变量,你不能快速编辑从 Collab 导入的 constants.py,也不能直接导入另一个 .ipynb文件。)

from dataclasses import dataclass


@dataclass
class Constants:
A = "foo"


cst = Constants()
print(cst.A)
>>> "foo"

您还可以创建一个经典的 PythonClass,但是这需要定义一个 __init__