Python 在装饰器中通过别名调用函数
我的当前代码允许函数调用包装装饰器,并在其代码中使用函数名。但是,我正在寻找一种方法,以参数的形式为函数指定一个“别名”。以下是当前代码:Python 在装饰器中通过别名调用函数,python,function,decorator,Python,Function,Decorator,我的当前代码允许函数调用包装装饰器,并在其代码中使用函数名。但是,我正在寻找一种方法,以参数的形式为函数指定一个“别名”。以下是当前代码: import os, sys # Take user input message = input('type command: ') # Command wrapper ALLCOMMANDS = {} def command(function): ALLCOMMANDS[function.__name__] = function ret
import os, sys
# Take user input
message = input('type command: ')
# Command wrapper
ALLCOMMANDS = {}
def command(function):
ALLCOMMANDS[function.__name__] = function
return function
# Commands
@command
def foo():
print("bar")
@command
def goo():
print('ber')
# Run appropriate command
if message in ALLCOMMANDS:
ALLCOMMANDS[message]()
例如,我希望能够通过一个名称调用函数,比如“!“foo”,所以可能参数看起来像@command(name='!foo')
,我只是不知道从那里开始在装饰器中使用该参数,因为它已经有一个参数了
我试图
# Command wrapper
ALLCOMMANDS = {}
def command(name):
ALLCOMMANDS[name] = name
return name
但是不断出现错误,我想我遗漏了一些东西,你应该多读一些关于python装饰器的内容。您在以下方面遇到错误:
def command(name):
ALLCOMMANDS[name] = name
return name
因为返回名称
装饰者只是语法上的糖。这:
@command
def foo():
print('bar')
相当于:
def foo():
print('bar')
foo = command(foo)
从这里你可以看到为什么你原来的装饰工程。最后,返回函数
当你有一个接受参数的装饰师时,事情会变得有点棘手。删除以下内容:
@command('nickname')
def foo():
print('bar')
看起来像这样:
def foo():
print('bar')
foo = command('nickname')(foo)
因此,要编写接受参数的装饰器,装饰器需要返回一个将要装饰的函数作为参数的函数:
def command(nickname):
def wrapped(f):
ALLCOMMANDS[nickname] = f
return f
return wrapped
还考虑制作<代码> ALLCODES < /C> >您的命令上的属性而不是全局的(<代码> UpPixSngs<代码>通常保留为常量):
您应该阅读更多关于python装饰器的内容。您在以下方面遇到错误:
def command(name):
ALLCOMMANDS[name] = name
return name
因为返回名称
装饰者只是语法上的糖。这:
@command
def foo():
print('bar')
相当于:
def foo():
print('bar')
foo = command(foo)
从这里你可以看到为什么你原来的装饰工程。最后,返回函数
当你有一个接受参数的装饰师时,事情会变得有点棘手。删除以下内容:
@command('nickname')
def foo():
print('bar')
看起来像这样:
def foo():
print('bar')
foo = command('nickname')(foo)
因此,要编写接受参数的装饰器,装饰器需要返回一个将要装饰的函数作为参数的函数:
def command(nickname):
def wrapped(f):
ALLCOMMANDS[nickname] = f
return f
return wrapped
还考虑制作<代码> ALLCODES < /C> >您的命令上的属性而不是全局的(<代码> UpPixSngs<代码>通常保留为常量):
如果你遵循这个,你应该能够传递一个名称参数:如果你遵循这个,你应该能够传递一个名称参数:啊,有意义。感谢您提供的详细帮助,我将实施这些建议SAH,很有意义。感谢您提供的详细帮助,我将实施这些建议