Discuss / Python / 不太理解最后的思考题

不太理解最后的思考题

Topic source

juven永恒

#1 Created at ... [Delete] [Delete and Lock User]
def log(text = None):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s start...'%func.__name__)
            func(*args, **kw)
            print('%s end...'%func.__name__)
            return func(*args, **kw)
        return wrapper
    return decorator
    
@log
def f():
    print('2015-3-25')

f()

@log('execute')
def f():
    print('2015-3-24')
f()
这样写的时候报错
Traceback (most recent call last):
  File "d:\hello.py", line 35, in <module>
    f()
TypeError: log.<locals>.decorator() missing 1 required positional argument: 'func'

而如果我这么写

def log(text = None):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s start...'%func.__name__)
            func(*args, **kw)
            print('%s end...'%func.__name__)
            return func(*args, **kw)
        return wrapper
    return decorator(text)
    
@log
def f():
    print('2015-3-25')

f()

@log('execute')
def f():
    print('2015-3-24')
f()

就会报错

f start...
2015-3-25
f end...
2015-3-25
Traceback (most recent call last):
  File "d:\hello.py", line 37, in <module>
    @log('execute')
     ^^^^^^^^^^^^^^
  File "d:\hello.py", line 8, in wrapper
    print('%s start...'%func.__name__)
                        ^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute '__name__'. Did you mean: '__ne__'?

如果这样写

def log(text = None):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s start...'%func.__name__)
            func(*args, **kw)
            print('%s end...'%func.__name__)
            return func(*args, **kw)
        return wrapper
    if callable(text):
        return decorator(text)
    else:
        return decorator 
@log
def f():
    print('2015-3-25')

f()

@log('execute')
def f():
    print('2015-3-24')
f()

就没问题。那能不能认为log方法里那个if和else各针对了一种情况,但我记得None和字符串都不是callable的吧?


  • 1

Reply