Определить, является ли функция вложенной - PullRequest
0 голосов
/ 12 февраля 2019

Как определить, является ли данная функция:

  1. Функция замыкания
  2. Вложенная функция, которая не является замыканием
  3. Невложенная функция

Я знаю, что могу сказать len(function.__closure__) > 0, но это только ответило бы, является ли это закрытием или нет.Что насчет незамкнутой вложенной функции?И есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 12 февраля 2019

Разница только между вложенной функцией с пустым закрытым набором имен и функцией, определенной на уровне модуля, равна их __qualname__.Все функции имеют атрибут __closure__, который является пустым, когда нет закрытого набора имен.

Атрибут __qualname__ доступен для записи, поэтому не является надежным способомобнаружение вложенной функции, но вы можете найти в ней строку .<locals>.:

>>> def foo():
...     def bar():
...         pass
...     return bar
...
>>> foo().__qualname__
'foo.<locals>.bar'

Вложенные функции, использующие закрытые имена, будут иметь непустой кортеж __closure__.

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