【发布时间】:2019-06-04 20:18:50
【问题描述】:
我正在学习 Python 装饰器和内部函数,并对我通过 codeacademy.com https://youtu.be/WOHsHaaJ8VQ 的 YouTube 视频学习的课程有一些疑问。
当使用内部函数时,有时我必须返回带括号的函数,有时不带括号。
如果我在不使用装饰器的情况下调用内部函数,则在返回内部函数时必须使用括号,否则内部函数似乎作为对象返回(?)。 在codeacademy.com的YouTube视频以及https://www.youtube.com/watch?v=FsAPt_9Bf3U这一个视频中,他们调用了不带括号的内部函数,并输出了预期的结果。
如果我使用装饰器调用内部函数,则在返回内部函数时必须不要使用括号,否则它似乎可以正常工作,但会引发错误以及其他一些奇怪的结果。
我编写了一些代码来测试不同的变化并输出结果。 您可以在此处查看实时代码:https://trinket.io/python/af1b47658f
# Test 1: The title function returns inner function wrapper without parentheses.
def title(print_name_function):
def wrapper():
print("Professor:")
print_name_function()
return wrapper # Without parentheses
def print_my_name():
print("John")
print('Test 1')
title(print_my_name)
# Results: Nothing is printed.
# Test 2: The title function returns inner function wrapper with parentheses.
def title(print_name_function):
def wrapper():
print("Professor:")
print_name_function()
return wrapper() # With parentheses
def print_my_name():
print("John")
print('Test 2')
title(print_my_name)
# Results: Professor John is printed.
# Test 3: Using a decorator while the title function returns inner function wrapper without parentheses
def title(print_name_function):
def wrapper():
print("Professor:")
print_name_function()
return wrapper # Without parentheses
@title
def print_my_name():
print("John")
print('Test 3')
print_my_name()
# Results: Professor John is printed.
# Test 4: Using a decorator while the title function returns inner function wrapper with parentheses
def title(print_name_function):
def wrapper():
print("Professor:")
print_name_function()
return wrapper() # With parentheses
@title
def print_my_name():
print("John")
print('Test 4')
print_my_name()
# Results: Professor John is printed and the following error is thrown:
'''
Traceback (most recent call last):
File "decorators.py", line 59, in <module>
print_my_name()
TypeError: 'NoneType' object is not callable.
'''
# Additionally, Professor John is printed before 'Test 4' is printed which seems that print_my_name() runs, then print('Test 4') runs.
在上面列出的关于我发现的内部函数/装饰器的两个视频中...
对于内部函数:内部函数在没有使用括号的情况下返回并正确运行。在我的测试中,我必须使用括号才能正确运行。
对于装饰器:内部函数在没有使用括号的情况下返回并正确运行。根据我的测试,不使用括号运行是可行的。带括号运行似乎可行,但输出顺序混淆并抛出错误(参见我的代码中的测试 4)。
【问题讨论】:
-
这可能会有所帮助。使用像
@title; def print_my_name(): print("John")这样的装饰器是def print_my_name(): print("John"); print_my_name = title(print_my_name)的语法糖 -
“我必须返回带括号的函数,有时没有。”。你想错了。如果没有括号,则返回函数对象本身,如果有括号,则返回调用函数的结果。
-
@Josh 如果您觉得我的回答有帮助,请随时接受并点赞;)