Разница только между вложенной функцией с пустым закрытым набором имен и функцией, определенной на уровне модуля, равна их __qualname__
.Все функции имеют атрибут __closure__
, который является пустым, когда нет закрытого набора имен.
Атрибут __qualname__
доступен для записи, поэтому не является надежным способомобнаружение вложенной функции, но вы можете найти в ней строку .<locals>.
:
>>> def foo():
... def bar():
... pass
... return bar
...
>>> foo().__qualname__
'foo.<locals>.bar'
Вложенные функции, использующие закрытые имена, будут иметь непустой кортеж __closure__
.