Каков наилучший способ определения постоянных переменных Python 3 - PullRequest
0 голосов
/ 25 мая 2018

Я пишу программу на python, которая содержит много постоянных переменных.Я хотел бы создать файл, который будет содержать все эти переменные, такие как .h файл в C, который содержит много #define.Я пытался использовать configparser , но мне не было легко и весело пользоваться.

Знаете ли вы лучший способ?

Ответы [ 5 ]

0 голосов
/ 24 июля 2019

Просто определите файл constants.py и запишите все свои константы.В Python нет другого волшебного трюка.Используйте заглавные буквы как общее соглашение.

0 голосов
/ 18 января 2019

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...
0 голосов
/ 25 мая 2018

В 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"

Теперь вы можете получить доступ к Paths.home как к обычному значению, но не можете присвоить ему.Вы можете определить несколько классов, украшенных @const, так как вы можете использовать несколько .h файлов.

0 голосов
/ 25 мая 2018

Вы можете использовать что-то вроде этого:

Структура файлов:

myapp/
    __init__.py
    settings.py
    main.py

settings.py

CONST_A = 'A'
CONST_B = 'B'

__ init __. Py

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

Перезаписан __setattr__ в Настройки * Класс 1016 * делает все атрибуты доступными только для чтения.Единственное требование - чтобы все ваши константы в вашем 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
0 голосов
/ 25 мая 2018

Python не допускает объявлений констант, таких как C или C ++.

Обычно в Python константы пишутся с большой буквы ( PEP 8 стандарты), что помогает программисту знать, что это константа.

Пример.MY_CONSTANT = "Whatever"

Другой правильный способ сделать это, который я не использую, но слышал о нем, - это использование метода:

def MY_CONSTANT():
    return "Whatever"

Теоретически, вызов MY_CONSTANT() действует так же, какконстанта.

РЕДАКТИРОВАТЬ

Как говорится в комментариях, кто-то может перейти и изменить значение, позвонив

MY_CONSTANT = lambda: 'Something else'

, но не забывайтеодин и тот же человек может вызвать MY_CONSTANT = "Something else" в первом примере и изменить начальное значение.В обоих случаях это маловероятно, но возможно.

...