英文:
Is it possible to pass a function argument into a decorator?
问题
Here is the translated code portion:
def my_decorator(func):
def inner():
"""do stuff with arg"""
func()
return func
return inner
@my_decorator
def my_func(arg):
pass
If you have any further questions or need additional translations, please let me know.
英文:
def my_decorator(func):
def inner():
"""do stuff with arg"""
func()
return func
return inner
@my_decorator
def my_func(arg):
pass
I wish to make the argument passed to the function my_function()
to be passed to the decorator my_decorator()
. I know it is possible to pass a variable to the decorator by putting it in a call like this: @my_decorator("arg")
, but I am using the pycord library, which passes arguments directly to the function.
Is there any way to do it in Python, or will I have to find another way?
I could put this code in the function itself, but if the code is expanded later, it could cause problems, and it's way easier to maintain and update a single decorator/wrapper than change multiple places in code.
答案1
得分: 3
是的,您的 def inner():
应该改为 def inner(arg):
;毕竟,您从装饰器返回的函数有效地替换了原始函数。以下是代码的翻译部分:
def my_decorator(func):
def inner(arg):
print(f"将 {arg} 增加 1 后再传递给 func 前的操作!")
return func(arg + 1)
return inner
@my_decorator
def my_func(arg):
print(f"my_func: {arg}")
my_func(9)
输出结果为:
将 9 增加 1 后再传递给 func 前的操作!
my_func: 10
英文:
Yes – your def inner():
should be def inner(arg):
; after all, the function you return from the decorator effectively replaces the original function.
def my_decorator(func):
def inner(arg):
print(f"Going to increase {arg} by 1 before passing it to func!")
return func(arg + 1)
return inner
@my_decorator
def my_func(arg):
print(f"my_func: {arg}")
my_func(9)
prints out
Going to increase 9 by 1 before passing it to func!
my_func: 10
答案2
得分: 0
是的,这是可能的,可以使用 *args
和 **kwargs
来实现。
def my_decorator(func):
def inner(*args, **kwargs):
"""处理参数的操作"""
func(*args, **kwargs)
return inner
@my_decorator
def my_func(arg):
pass
请注意,我已经将HTML实体编码 "
替换为正常的双引号。
英文:
Yes, that is possible and could be achieved using *args
amd **kwargs
def my_decorator(func):
def inner(*args, **kwargs):
"""do stuff with arg"""
func(*args, **kwargs)
return func
return inner
@my_decorator
def my_func(arg):
pass
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论