python - 传入装饰函数的参数
问题描述
一个什么都不做的简单装饰器可以像下面这样完成:
def decorator(func):
return func # don't need to call!
@decorator
def print_word(word='python'):
print (word)
这将运行良好:
>>> print_word()
python
但是,如果我将它包装在一个内部函数中,它就会被称为喜欢这样:
def decorator(func):
def _func(*args, **kwargs):
print ("Args: %s | Kwargs: %s" % (args, kwargs))
return func(*args, **kwargs) # <== Here I need to "call" it with ()
return _func
@decorator
def print_word(word='python'):
print (word)
>>> print_word('ok')
Args: ('ok',) | Kwargs: {}
ok
为什么这两种方法不同?如何调用_func
“绑定”到_func(*args, **kwargs)
?
解决方案
def decorator(func):
因为它是一个装饰器,我们期望它返回一些可以调用的东西。
return func # don't need to call!
对,因为func
是我们将返回的“可以调用的东西”。装饰器没有效果。
然后如果我将它包装在一个内部函数中,它就被称为 like so
我们正在做的_func
是创建一个将由装饰器返回的新函数,并根据传入的定义其行为func
。func
所以当装饰器被调用时我们不会调用;但我们确实在 的主体内调用它_func
,因为这就是我们在func
执行时_func
执行的方式。
为什么这两种方法不同?
我不明白这个问题。他们有什么相同之处?他们都在定义一个装饰器,好吧。他们以完全不同的方式做到这一点。
如何调用
_func
“绑定它”
我不明白您在这里绑定的意思,并且_func
在此代码中没有直接按名称调用。它在被调用时print_word
被调用,因为装饰器已替换print_word
为本地创建的_func
. (每次使用装饰器时,都会创建一个具有相同_func
名称的单独函数。这就是您遇到的问题吗?)
推荐阅读
- docusignapi - 在 Docusign 中选择哪个 OAuth 流程:AuthCode 还是 JWT?
- flutter - Flutter 中的 Bloc Provider 和 Normal Provider 有什么区别?
- reactjs - Firestore 在 delete() 上创建和删除副本而不是删除原始文档
- python - 为什么我的警告命令会删除 .json 文件中的所有内容?(discord.py)
- excel - 使用 Excel 是否可以在不显式生成表格数据但仅使用公式的情况下绘制图表?
- typescript - 如何在 TS 中使用 AMD 模块在一个文件中包含非相对导入?
- java - 制作字符串序列
- python - Python matplotlib y 轴无法正常工作
- python - 如何向模型添加更多功能(标签)
- reactjs - 每月数据值,但希望每年显示 xticks chartJS