Проблемы с оформлением Python Decorator - PullRequest
1 голос
/ 22 августа 2011

У меня есть статический класс, у которого есть метод hello. Я хочу запустить панель методов декоратора, прежде чем привет. Однако, используя следующий код, я всегда получаю сообщение об ошибке «name 'bar' notfined». Кто-нибудь знает, что происходит? Спасибо!

class foo():
    @staticmethod
    @bar
    def hello():
        print "hello"

    def bar(fn):
        def wrapped():
            print "bar"
            return fn()
        return wrapped

foo.hello()

Ответы [ 2 ]

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

Вы можете просто изменить свой код на:

def bar(fn):
    def wrapped():
        print "bar"
        return fn()
    return wrapped
class foo():
    @staticmethod
    @bar
    def hello():
        print "hello"
foo.hello()

Это происходит потому, что вы должны определить функцию перед ее вызовом. Это проблема, потому что это:

@bar
def hello():
    print "hello"

эквивалентно:

def hello():
    print "hello"
hello = bar(hello)

Итак, вы пытались вызвать функцию до того, как ее определили.

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

Потому что это еще не определено. Кроме того, этот декоратор вообще не должен быть методом.

def bar(fn):
    # ...

class foo(object):
    @staticmethod
    @bar
    def hello():
        # ...

# ...

Кроме того, не используйте статические методы, если вы действительно не знаете, что делаете. Вместо этого сделайте это бесплатной функцией.

...