В Python у циклов (как и у if) вообще нет своей области видимости, можно переменную вообще первый раз внутри цикла присвоить, и снаружи потом использовать. Если не присвоишь - просто будет NameError
>>> for i in range(10):
... a = 2
...
>>> print(i)
9
>>> print(a)
2
>>> print(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
В 95% случаев, имхо, dataclasses не нужны. Только если нужны мутабельные контейнеры — их на NamedTuple не сделаешь. Плюс, в typing.NamedTuple нельзя переопределять некоторые методы, а точнее:
# attributes prohibited to set in NamedTuple class syntax
_prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__',
'_fields', '_field_defaults', '_field_types',
'_make', '_replace', '_asdict', '_source')
В Python у циклов (как и у if) вообще нет своей области видимости, можно переменную вообще первый раз внутри цикла присвоить, и снаружи потом использовать. Если не присвоишь - просто будет
NameError
В 95% случаев, имхо,
dataclasses
не нужны. Только если нужны мутабельные контейнеры — их наNamedTuple
не сделаешь. Плюс, вtyping.NamedTuple
нельзя переопределять некоторые методы, а точнее: