使用“设置”模块创建常量?

时间:2010-09-29 17:57:03

标签: python

我已经在谷歌和Stackoverflow上进行了搜索,但无法找到我要找的内容。

我对Python比较陌生。我希望创建一个“设置”模块,其中将存储各种特定于应用程序的常量。

以下是我想要设置代码的方法

settings.py

CONSTANT = 'value'

script.py

import settings

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

我收到一条Python错误,指出:“未定义全局名称'CONSTANT'。

我注意到Django的源代码,他们的settings.py文件的常量命名就像我一样。我对如何将它们导入脚本并通过应用程序引用感到困惑。

修改

感谢您的所有答案!我尝试了以下方法:

import settings

print settings.CONSTANT

我收到同样的错误: ImportError:无法导入名称CONSTANT

10 个答案:

答案 0 :(得分:125)

最简单的方法是将设置作为模块。

(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之后的任何内容来自设置模块。

答案 1 :(得分:16)

  

第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

注意第二种导入方法,您可以直接使用dict名称

小提示您可以使用* 导入所有 设置文件上的代码,以防您有大文件,并且您将在您的应用程序上使用它上面的大多数设置

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

我希望有所帮助。

答案 2 :(得分:5)

当你import settings时,一个名为module的{​​{1}}对象被放置在全局命名空间中 - 这个对象携带的是settings中的属性。即在settings.py之外,您将settings.py称为CONSTANT

答案 3 :(得分:3)

完全按照原样保留settings.py,然后就像Django一样使用它:

import settings

def func():
    var = settings.CONSTANT

答案 4 :(得分:3)

查看我发布到Can I prevent modifying an object in Python?的答案,该答案可以满足您的需求(以及强制使用大写标识符)。对于这个问题,它实际上可能是一个比另一个更好的答案。

答案 5 :(得分:2)

...或者,如果确实希望将settings.py中的所有常量导入全局命名空间,则可以运行

from settings import *

...但是正如其他人在这里提到的那样使用settings.CONSTANT是非常正确的。

答案 6 :(得分:2)

我是python中的新手,但是如果我们像函数一样定义一个常量 在setings.py

def CONST1():
    return "some value"

main.py

import setings

print setings.CONST1() ##take an constant value

这里我只看到一个,价值不能改变,但它的工作就像一个函数..

答案 7 :(得分:2)

这种方法效率更高,因为它只加载/评估一次设置变量。它适用于我所有的Python项目。

pip install python-settings

此处的文档:https://github.com/charlsagente/python-settings

您需要一个settings.py文件,其中包含所有已定义的常量,例如:

# settings.py

DATABASE_HOST = '10.0.0.1'

然后,您需要设置一个环境变量(export SETTINGS_MODULE =设置)或手动调用configure方法:

# something_else.py

from python_settings import settings
from . import settings as my_local_settings

settings.configure(my_local_settings) # configure() receives a python module

该实用程序还支持重载对象的惰性初始化,因此,当您运行python项目时,它加载速度更快,因为它仅在需要时评估设置变量

# settings.py

from python_settings import LazySetting
from my_awesome_library import HeavyInitializationClass # Heavy to initialize object

LAZY_INITIALIZATION = LazySetting(HeavyInitializationClass, "127.0.0.1:4222") 
# LazySetting(Class, *args, **kwargs)

只需配置一次,然后在需要的地方调用变量:

# my_awesome_file.py

from python_settings import settings 

print(settings.DATABASE_HOST) # Will print '10.0.0.1'

答案 8 :(得分:1)

试试这个:

在settings.py中:

CONSTANT = 5

在您的主文件中:

from settings import CONSTANT

class A:
    b = CONSTANT

    def printb(self):
         print self.b

我认为您的上述错误来自导入太晚的设置文件。确保它位于文件的顶部。

答案 9 :(得分:0)

另外值得一试的是simple-settings项目,它允许您在runtim中将设置提供给您的脚本,这允许特定于环境的设置(想想开发,测试,产品......)