通过“设置”模块创建常量?

80 投票
10 回答
113784 浏览
提问于 2025-04-16 04:46

我最近刚接触Python,想创建一个“设置”模块,用来存储一些特定于应用程序的常量。

这是我想要设置的代码结构:

settings.py

CONSTANT = 'value'

script.py

import settings

def func():
    var = CONSTANT
    # do some more coding
    return var

但是我遇到了一个Python错误,提示:

global name 'CONSTANT' is not defined.

我注意到Django的源代码中,他们的settings.py文件里也有和我一样的常量。我有点困惑,为什么他们可以在脚本中导入这些常量,并在应用程序中使用。

编辑

感谢大家的回答!我尝试了以下方法:

import settings

print settings.CONSTANT

但我还是得到了同样的错误

ImportError: cannot import name CONSTANT

10 个回答

5

当你使用 import settings 这行代码时,系统会在全局范围内创建一个叫做 settings 的模块对象。这个对象里面包含了 settings.py 文件里定义的内容,作为它的属性。也就是说,在 settings.py 文件外面,你可以通过 settings.CONSTANT 来引用里面的 CONSTANT 这个内容。

18

步骤 1:在同一个文件夹里创建一个新的文件 settings.py,这样更方便访问。

#database configuration settings

database = dict(
    DATABASE = "mysql",
    USER     = "Lark",
    PASS     = ""
)

#application predefined constants

app = dict(
    VERSION   = 1.0,
    GITHUB    = "{url}"
)

步骤 2:把设置模块导入到你的应用文件里。

import settings as s            # s is aliasing settings & settings is the actual file you do not have to add .py 

print(s.database['DATABASE'])   # should output mysql

print(s.app['VERSION'])         # should output 1.0

如果你不喜欢用像 s 这样的别名,你可以使用不同的语法

from settings import database, app

print(database['DATABASE'])   # should output mysql

print(app['VERSION'])         # should output 1.0

注意:在第二种导入方法中,你可以直接使用字典的名称。

小贴士:如果你的设置文件很大,并且你会在应用中使用大部分设置,可以通过使用 * 来导入所有代码。

from settings import *      # * represent all the code on the file, it will work like step 2


print(database['USER'])       # should output lark

print(app['VERSION'])         # should output 1.0

希望这对你有帮助。

144

最简单的方法就是把设置放在一个模块里。

(settings.py)

CONSTANT1 = "value1"
CONSTANT2 = "value2"

(consumer.py)

import settings

print settings.CONSTANT1
print settings.CONSTANT2

当你导入一个Python模块时,你需要在使用它的变量前加上模块的名字。如果你知道在某个文件里具体想用哪些值,并且不担心这些值在运行过程中会改变,那么你可以这样做:

from settings import CONSTANT1, CONSTANT2

print CONSTANT1
print CONSTANT2

不过我不建议过于依赖这种方式。这样会让阅读你代码的人很难知道这些值是从哪里来的,而且如果其他模块改变了这些值,你的代码就不会更新了。还有一种方法是:

import settings as s

print s.CONSTANT1
print s.CONSTANT2

这种方法可以减少你输入的内容,能够自动更新,并且只需要读代码的人记住,任何在s后面的东西都是来自设置模块的。

撰写回答