Рассмотрим этот код:
def gee(bool_, int32, int64, str_):
class S:
bool_ = bool_
int32 = int32
int64 = int64
str_ = str_
return S
gee(1, 2, 3, 4)
Выполнение этого дает ошибку:
Traceback (most recent call last):
File "test_.py", line 36, in <module>
gee(1, 2, 3, 4)
File "test_.py", line 27, in gee
class S:
File "test_.py", line 28, in S
bool_ = bool_
NameError: name 'bool_' is not defined
Я понятия не имею, какие правила области действия / закрытия применяются здесь.nonlocal
исправляет ошибку, но результат не тот, который я ожидал:
def gee(bool_, int32, int64, str_):
class S:
nonlocal bool_, int32, int64, str_
bool_ = None
int32 = None
int64 = None
str_ = None
print(bool_, int32, int64, str_ )
return S
g = gee(1, 2, 3, 4)
g.bool_
Выходы:
None None None None
Traceback (most recent call last):
File "test_.py", line 38, in <module>
g.bool_
AttributeError: type object 'S' has no attribute 'bool_'
Кроме переименования, что я могу сделать, чтобы сделать назначения в 1-м фрагменте кодаРабота?И почему он так себя ведет?Потому что есть name = ...
?Почему Python не оценивает имя перед присваиванием?