Python: Использование фиктивного класса для передачи имен переменных? - PullRequest
3 голосов
/ 06 марта 2012

Это продолжение функции , которая возвращает диктовку, ключами которой являются имена входных аргументов , которые я многому научил (перефразировав):

  • объекты Python,в общем, не знаю их имен.
  • Нет, это вообще невозможно с *args.Вам придется использовать ключевые аргументы
  • Когда количество аргументов фиксировано, вы можете сделать это с помощью locals
  • Используя globals ().Это будет работать только в том случае, если значения уникальны в области видимости модуля, поэтому он хрупок
  • Вероятно, вам лучше не делать этого в любом случае и переосмыслить проблему.

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

Поскольку я хотел бы узнать, как все делать правильно, считается ли это плохой практикой создавать манекенакласс, чтобы просто хранить переменные с прикрепленными к ним именами?

class system: pass
S = system ()
S.T = 1.0
S.N = 20
S.L = 10

print vars(S)

Это завершает мое первоначальное намерение, но мне остается задуматься, есть ли что-то, что я не рассматриваю, что может укусить меня позже.

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Я делаю это как дань уважения Javascript, где у вас нет различий между словарями и переменными экземпляра. Я думаю, что это не обязательно антипаттерн, также потому, что в отличие от словарей, если у вас нет значения, он вызывает AttributeError вместо KeyError, и легче обнаружить опечатки имени. Как я уже сказал, не антипаттерн, при условии, что

  1. область действия класса ограничена очень специфическим использованием
  2. подпрограмма или метод, который вы вызываете (например, vars в вашем примере), являются частными по своей природе. Я бы не хотел, чтобы общедоступный интерфейс имел эту семантику вызова, а также как возвращаемую сущность
  3. имя класса-пустышки предельно ясно в его намерениях и типе совокупности, которую он представляет.
  4. время жизни этого объекта короткое и беспрецедентное. Это просто временная сумка данных.

Если эти ограничения не соблюдаются, перейдите к полностью распознанному классу со свойствами.

1 голос
/ 06 марта 2012

вы можете сделать это, но почему бы не использовать словарь?

но если вы сделаете это, вам лучше передать аргументы ключевых слов в конструктор класса, а затем позволить конструктору скопировать их в члены приложения. что-то вроде:

class Foo(object):

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...