InnerClass.innerFn
никогда не был методом класса. Это был несвязанный метод объекта. Объекты несвязанных методов больше не существуют в Python 3; InnerClass.innerFn
теперь разрешается в обычный объект функции.
В зависимости от того, почему вы выполняли эту проверку, вы можете вообще не захотеть рассматривать InnerClass.innerFn
как метод. Если вы это сделаете, вы можете получить что-то похожее , но не эквивалентное старой проверке, проверив __qualname__
:
def check(obj):
parts = obj.__qualname__.split('.')
return len(parts) > 1 and not parts[-2].startswith('<')
Функция __qualname__
имеет хотя бы один .
в нем, если он был определен внутри класса или другой области видимости функции. Если он был определен в области действия функции, вторым по последнему компонентом __qualname__
обычно является <locals>
, но это также может быть несколько других вещей, таких как <listcomp>
или <genexp>
в области действия функции, созданной понимание списка, выражение генератора или другие подобные контексты. Я почти уверен, что все случаи области действия функции начинаются с <
, а случаи области действия класса никогда не делают.
Это не эквивалентно старой проверке, если функция была определена вне класса и затем установить в качестве атрибута класса или в других случаях, когда метаданные __qualname__
не совпадают с тем, был ли доступ к функции как атрибутом класса, и я не удосужился обработать нефункциональные типы ввода.