我有这段代码:
def foo(bar):
def test(some_string):
return 'Decorator test: '+bar(some_string)
return test
def main():
print(bar('test1'))
@foo
def bar(some_string):
return some_string[:3]
我理解调用bar('test1)
基本上是调用foo(bar('test1'))
,但当我尝试在some_string
之前打印foo
之前,我得到some_string is not defined
:
def foo(bar):
print(some_string)
def test(some_string):
return 'Decorator test: '+bar(some_string)
return test
test
some_string
如何foo
了解test
Decorator test: '+bar(some_string)
装饰工作?直接返回some_string
并不起作用print(c(input$buttonNext,randomNumber,input_radio))
未定义。答案 0 :(得分:5)
我了解调用
bar('test1)
基本上是调用foo(bar('test1'))
不,不是,你的理解是不正确的。它基本上是在呼叫
foo(bar)('test')
@foo
装饰器语法告诉Python调用foo()
传递bar
命名的函数对象(并将结果分配回名称bar
)。 / p>
foo()
装饰器返回了一个新的函数对象:
def test(some_string):
# ...
return test
因此foo(bar)
的结果是名为test
的函数对象(foo()
装饰器中的本地名称)。 foo(bar)('test')
因此被称为test('test')
。
如果您想打印传递给test(..)
的参数,请在 内执行此操作:
def foo(bar):
def test(some_string):
print(some_string)
return 'Decorator test: '+bar(some_string)
return test
答案 1 :(得分:1)
我了解调用
bar('test1)
基本上是调用foo(bar('test1'))
不,那是不正确的。
调用bar('test1')
等同于
bar = foo(bar)
bar('test1')
为什么我必须返回
test
装饰工作?直接返回Decorator测试:' + bar(some_string)不起作用,因为some_string没有定义。
当你这样做时
@decorator
def func():
pass
Python将其翻译为
def func():
pass
func = decorator(func)
如您所见,Python希望decorator
返回 new 函数。这就是为什么您必须从test
foo
返回bar
才能正常工作的原因。否则,None
被分配到bar
:
>>> def foo(bar):
def test(some_string):
return 'Decorator test: '+bar(some_string)
>>> @foo
def bar(some_string):
return some_string[:3]
>>> bar()
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
bar()
TypeError: 'NoneType' object is not callable
当foo没有?
时,测试如何知道some_string?
只是因为在some_string
到达之前未创建test
。 some_string
是[{1}}的参数,因此它仅存在于test
的范围内。否则,不存在名称test
,因此如果您尝试访问它,则会获得some_string
- 包括NameError
内部。
如果您想foo
print
的值,请在some_string
内执行此操作:
test