Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用“创建常量”;“设置”;模块?_Python - Fatal编程技术网

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

Python 使用“创建常量”;“设置”;模块?,python,Python,我对Python比较陌生。我希望创建一个“设置”模块,其中存储各种特定于应用程序的常量 以下是我希望如何设置代码: 设置.py CONSTANT = 'value' CONSTANT1 = "value1" CONSTANT2 = "value2" script.py import settings def func(): var = CONSTANT # do some more coding return var 我收到一个Python错误,说明: 未定义全局

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

以下是我希望如何设置代码:

设置.py

CONSTANT = 'value'
CONSTANT1 = "value1"
CONSTANT2 = "value2"
script.py

import settings

def func():
    var = CONSTANT
    # do some more coding
    return var
我收到一个Python错误,说明:

未定义全局名称“常量”。

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

编辑

谢谢你的回答!我尝试了以下方法:

import settings

print settings.CONSTANT
我也犯了同样的错误

ImportError:无法导入名称常量


让settings.py保持原样,然后您可以像Django一样使用它:

import settings

def func():
    var = settings.CONSTANT

最简单的方法是将设置设置为一个模块

(settings.py)

(consumer.py)

导入python模块时,必须在从中提取的变量前面加上模块名。如果您确切地知道要在给定文件中使用哪些值,并且不担心它们在执行过程中发生变化,那么您可以这样做

from settings import CONSTANT1, CONSTANT2

print CONSTANT1
print CONSTANT2
但我不会被最后一个冲昏头脑。阅读您的代码的人很难判断值来自何处。并阻止在其他客户端模块更改这些值时更新这些值。最后一种方法是

import settings as s

print s.CONSTANT1
print s.CONSTANT2

这将节省您的键入,传播更新,并且只要求读者记住
s
之后的任何内容都来自设置模块。

当您导入设置时,一个名为
settings
module
对象被放置在全局命名空间中,该对象将
settings.py
中的has作为属性携带。也就是说,在
settings.py
之外,您将
CONSTANT
称为
settings.CONSTANT

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

from settings import *
…但在其他方面使用
设置。常量
,正如大家在这里提到的,是非常正确的。

尝试以下方法:

在settings.py中:

CONSTANT = 5
在主文件中:

from settings import CONSTANT

class A:
    b = CONSTANT

    def printb(self):
         print self.b

我认为您的上述错误是由于导入设置文件太晚造成的。确保它在文件的顶部

查看我发布的答案,该答案符合您的要求(以及强制使用大写标识符)。对于这个问题,它实际上可能是一个比另一个更好的答案。

我是python新手,但是如果我们定义一个常量,比如函数 关于setings.py

def CONST1():
    return "some value"
main.py

import setings

print setings.CONST1() ##take an constant value
在这里我只看到一个,值是不能改变的,但它像一个函数一样工作

步骤1:在同一目录下创建一个新文件settings.py,以便于访问。

步骤2:将设置模块导入应用程序文件。

如果您不喜欢使用别名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

我希望这会有所帮助。

同样值得一看的是这个项目,它允许您在runtim时将设置输入到脚本中,它允许特定于环境的设置(想想开发、测试、生产等)

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

pip install python-settings
此处的文档:

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

# settings.py

DATABASE_HOST = '10.0.0.1'
然后,您需要设置一个env变量(导出设置\u MODULE=SETTINGS)或手动调用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变量

# 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'

@delnan我特别避免提及机制,以免你的答案过时;)嗯,实际上已经过时了;)知道确切的语义是有用的,而且更可取,但是为了让它工作,不需要它——尽管有必要知道它的含义,这在你的回答中已经概括了。我认为常量的概念是它不能在运行时更改?@Lie Ryan,Python没有常量。在多道程序设计项目中,你永远不会知道。@AaronMcSmoot:是的,但如果你甚至打算在运行后更改一个常数,那就很可能是你的设计错误了。关于使用
import
语句的三种可能方法,请参阅我的答案。实际上,这是不可取的。见例。虽然在这种情况下,它有一个可能令人满意的副作用,即对常数的更改不会影响其他模块。从技术上讲,我没有说进口*是明智的,只是说有可能:P@delnan. 我不太确定这是否可取。这取决于应用程序,但同样可能的是,应该传播(如果发生)没有意义的更改。如果
settings
未定义
CONSTANT
,则应获得
AttributeError
,如果无法导入设置,则应获得
ImportError
,在这种情况下,它甚至不会查看
常量
那么我有什么做错了吗?请将您最后发布的两行内容完全按照您发布的内容放在文件中,然后查看是否有效。谢谢大家的帮助。我想出来了。这与init.py文件的位置有关。我试图导入设置,因此python无法找到
# 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
# 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'