我已经在谷歌和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
答案 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中将设置提供给您的脚本,这允许特定于环境的设置(想想开发,测试,产品......)