Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
定义Python3常量变量的最佳方法是什么_Python_Python 3.x_Constants_Configuration Files - Fatal编程技术网

定义Python3常量变量的最佳方法是什么

定义Python3常量变量的最佳方法是什么,python,python-3.x,constants,configuration-files,Python,Python 3.x,Constants,Configuration Files,我正在用python编写一个包含许多常量变量的程序。我想创建一个包含所有这些变量的文件,比如C中包含许多#define的.h文件。我试着使用它,但是我发现它不容易使用,也不好玩 你知道更好的方法吗Python不允许像C或C++那样的常数声明。 通常在Python中,常量是大写的(标准),这有助于程序员知道它是一个常量 例如,MY_CONSTANT=“Whatever” 另一种我没有使用但听说过的有效方法是使用以下方法: def MY_CONSTANT(): return "Whateve

我正在用python编写一个包含许多常量变量的程序。我想创建一个包含所有这些变量的文件,比如C中包含许多#define的.h文件。我试着使用它,但是我发现它不容易使用,也不好玩


你知道更好的方法吗

Python不允许像C或C++那样的常数声明。 通常在Python中,常量是大写的(标准),这有助于程序员知道它是一个常量

例如,
MY_CONSTANT=“Whatever”

另一种我没有使用但听说过的有效方法是使用以下方法:

def MY_CONSTANT():
    return "Whatever"
现在理论上,调用
MY_CONSTANT()
就像一个常量一样

编辑

正如评论所说,有人可以通过调用来更改值

MY_CONSTANT = lambda: 'Something else'

但不要忘记,在第一个示例中,同一个人可以调用
MY_CONSTANT=“Something other”
,并更改初始值。在这两种情况下都不太可能,但都是可能的。

Python中没有常量,就像它们在C或Java中存在一样。您可以通过以下函数模拟它们:

def FOO():
  return "foo"
您可以将函数调用包装在属性中,从而使其看起来像一个变量:

class Const:
  @property
  def FOO(self):
    return "foo"

CONST = Const()  # You need an instance

if something == CONST.FOO:
  ...
使用一些元元素,您可以使用简洁的语法获得不可设置的属性:

def const(cls):
    # Replace a class's attributes with properties,
    # and itself with an instance of its doppelganger.
    is_special = lambda name: (name.startswith("__") and name.endswith("__"))
    class_contents = {n: getattr(cls, n) for n in vars(cls) if not is_special(n)}
    def unbind(value):  # Get the value out of the lexical closure.
        return lambda self: value
    propertified_contents = {name: property(unbind(value))
                             for (name, value) in class_contents.items()}
    receptor = type(cls.__name__, (object,), propertified_contents)
    return receptor()  # Replace with an instance, so properties work.


@const
class Paths(object):
    home = "/home"
    null = "/dev/null"

现在,您可以将
路径.home
作为正常值访问,但不能分配给它。您可以定义几个用
@const
修饰的类,因为您可能会使用几个
.h
文件。

您可以使用如下内容:

文件结构:

myapp/
    __init__.py
    settings.py
    main.py
设置.py

CONST_A = 'A'
CONST_B = 'B'
__初始值

from . import settings as global_settings


class Settings:

    def __init__(self):
        for setting in dir(global_settings):
            if setting.isupper():
                setattr(self, setting, getattr(global_settings, setting))

    def __setattr__(self, attr, value):
        if not getattr(self, attr, None):
            super().__setattr__(attr, value)
        else:
            raise TypeError("'constant' does not support item assignment")


settings = Settings()
main.py

import settings

print(settings.CONST_A)  # prints A

settings.CONST_A = 'C'  # raises TypeError error

print(settings.CONST_A)  # prints A

settings.CONST_C = 'C'  # also able to add new constants
print(settings.CONST_C)  # prints C
Settings类中的Overwrited__setattr__;使所有属性都是只读的。 唯一的要求是将settings.py中的所有常量都用大写字母书写。 但请注意,如果直接导入变量,它将不起作用:

from settings import CONST_A

print(settings.CONST_A)  # prints A

settings.CONST_A = 'C'  # sets C

print(settings.CONST_A)  # prints C

Python没有经过预处理。您只需创建一个文件constant.py

#!/usr/bin/env python
# encoding: utf-8
"""
constant.py
"""

MY_CONSTANT = 50
在需要常量值时导入constant.py文件,如下面的示例所示

#!/usr/bin/env python
# encoding: utf-8
"""
example.py
"""
import constant
print constant.MY_CONSTANT * 2
通过这种方式,您可以在整个项目中使用常量

如果常量绑定到特定类,并在该类中私自使用,则您还可以选择使其特定于该类:

class Foo(object):
   GOOD = 0
   BAD = 1

   def __init__(self...
如果要定义和使用整个模块,请将它们放在模块的顶部

PIE = 3.47

class Foo(object):
   def __init__(self...

只需定义一个constants.py文件并写入所有常量。Python中没有其他魔术。使用CAP作为一般惯例

Python 3.8中的常量(在某种意义上)+ Python3.8引入了
typing.Final
类型限定符,用于指示不应重新分配、重新定义或重写变量或属性

从输入import Final开始
#注释模块变量
#(带或不带显式类型,使用语法Final[])
#(类型在没有显式类型时自动确定)
PI:最终[浮动]=3.141592654
回答所有问题:最终=42
#注释类主体中的实例变量
#(如果未指定值,则需要显式类型)
课程点:
x:最终[内部]
y:Final=0
定义初始化(self,x:int):
self.x=x
#直接注释实例变量
#(仅允许在_init__方法中使用)
班长:
定义初始(自我,出生年份:int):
自我出生年份:最终=出生年份
如果重新分配或重新定义
Final
变量,过梁和类型检查器将向您显示警告。请注意,没有运行时检查,因此您仍然可以运行下面的代码

ANSWER\u TO\u一切:Final=42
ANSWER_TO_EVERYTHING=420显示警告
打印(回答所有问题)#打印420

还有
typing.final
decorator,用于限制继承类和重写方法。

对于配置变量,您可以设置环境变量并从代码中读取它们。您也可以使用JSON或YAML文件。相关帖子:
MY_CONSTANT=lambda:“其他的东西”
–不知道为什么要麻烦使用“常量函数”,它不再是常量了。@scharette重点是,无论您使用
def
还是
lambda
,您仍然可以轻松更改
MY_CONSTANT
的值;它只是一个引用某个对象的名称,无论该对象是
int
还是
函数
。另外,调用函数的开销(必须添加
()
的词法开销和设置堆栈帧的运行时开销)超过了任何可感知的好处。
MY_CONSTANT=lambda:“新值”
与MY_CONSTANT=“new value!”一样易于编写;把它变成一个函数没有任何用处。你是对的,这不是我理解他的意思的方式。我并不是说这是一个真正的常量,他要求的是类似C的常量,这在内置python中是不存在的。我的观点是,如果有人在调用My_CONSTANT=lambda:“其他东西”他真的想改变这个值。同样的,在C中改变常数本身的人也是如此。我的意思是,常数是一个常数,直到有人改变初始值的那一天……我把你的代码当成了它,初始化类给我错误“预期缩进”。修正后,它开始工作了。干杯:-)很有趣<代码>导入设置
main.py中的
import settings
导入变量
settings
而不是
settings.py