Поиск в пространстве имен всегда сначала проверяет локальную область.В определении метода это класс.
Во время определения Test.a
не существует локального имени a
, только глобальное a
.К моменту определения Test.b
, Test.a
уже определено, поэтому локальное имя a
существует, и глобальная область не проверяется.
Если вы хотите указать f
в Test.b
на глобальный a
, используйте:
def a(x):
print("Global A from {}".format(x))
class Test:
def a(self, f=a):
print("A")
f("a") # this will call the global method a()
def b(self, f=None):
f = f or a
print("B")
f("b") # this will call the class method a()
t=Test()
t.b()
, который печатает
B
Global A from b
, как ожидается.