Почему не следует динамически генерировать имена переменных в python? - PullRequest
0 голосов
/ 29 мая 2018

Прямо сейчас я изучаю Python и борюсь с несколькими концепциями ООП, одна из которых заключается в том, насколько трудно (для меня) динамически инициализировать экземпляры классов и назначать их динамически генерируемому имени переменной, и почему я читаю этоЯ не должен делать это в первую очередь.

В большинстве потоков с аналогичным направлением ответ, как представляется, заключается в том, что делать это не на Pythonic.

Например, генерировать имена переменных на лету в python

Может кто-нибудь уточнить, пожалуйста?

Возьмите типичный пример обучения ООП:

LOE = ["graham", "eric", "terry_G", "terry_J", "john", "carol"]
class Employee():
    def __init__(self, name, job="comedian"):
        self.name = name
        self.job = job

Почему лучше сделать это:

employees = []
for name in LOE:
    emp = Employee(name)
    employees.append(emp)

а затем

for emp in employees:
    if emp.name == "eric":
        print(emp.job)

вместо этого

for name in LOE:
    globals()[name] = Employee(name)

и

print(eric.job)

Спасибо!

Ответы [ 2 ]

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

Если вы динамически генерируете имена переменных, вы не знаете, какие имена существуют, и вы не можете использовать их в коде.

globals()[some_unknown_name] = Foo()

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

eric.bar()

Поскольку вы не знаете, существует ли eric.Вам все равно придется проверять существование eric, используя словари / списки:

if 'eric' in globals(): ...

Так что просто сохраните ваши объекты в словаре или списке, чтобы начать с:

people = {}
people['eric'] = Foo()

Таким образом, вы также можете безопасно перебрать одну структуру данных, чтобы получить доступ ко всем вашим сгруппированным объектам без необходимости сортировки их из других глобальных переменных.

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

globals() дает вам dict, в который вы можете вводить имена.Но вы также можете создать свой собственный dict и поместить туда имена.

Так что все сводится к идее "пространств имен", то есть к концепции разделения похожих вещей в отдельные структуры данных.

Вы должны сделать это:

employees = {}
employees['alice'] = ...
employees['bob'] = ...
employees['chuck'] = ...

Теперь, если у вас есть другая часть вашей программы, где вы описываете детали тренировки, вы можете сделать это:

drill['chuck'] = ...

И выне будет столкновения имени с Чаком человеком.Если бы все было глобально, у вас была бы проблема.Чак может даже потерять работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...