Пространство имен в параметрах метода - PullRequest
2 голосов
/ 18 августа 2011

Я удивлен, что пространство имен параметров функции в методе является классом, а не глобальной областью действия.

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=a):
        print("B")
        f("b")   # this will call the class method a()

t=Test()
t.b()

Как это объяснить? И как мне получить доступ к глобальному a () из параметров b?

1 Ответ

2 голосов
/ 18 августа 2011

Поиск в пространстве имен всегда сначала проверяет локальную область.В определении метода это класс.

Во время определения 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

, как ожидается.

...