在D中通过别名调用函数

2024-10-02 04:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我的当前代码允许函数调用包装装饰器,并在其代码中使用函数名。但是,我正在寻找一种方法,以一种参数的方式给函数一个“别名”。以下是当前代码:

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'),我只是不知道从那里开始在decorator中使用该参数,因为它已经有一个参数了。你知道吗

我试过了

# Command wrapper
ALLCOMMANDS = {}
def command(name):
    ALLCOMMANDS[name] = name
    return name

但是不断地出错,我想我遗漏了什么


Tags: 函数代码namemessageinput参数returnfoo
1条回答
网友
1楼 · 发布于 2024-10-02 04:25:24

您应该阅读更多关于python装饰器的内容。您遇到以下错误:

def command(name):
    ALLCOMMANDS[name] = name
    return name

因为return name。你知道吗

装饰者只是句法上的糖。这是:

@command
def foo():
    print('bar')

相当于:

def foo():
    print('bar')

foo = command(foo)

从这里你可以看到为什么你原来的装饰工程。最后你return function。你知道吗

当你有一个喜欢争论的装饰师时,事情就变得有点棘手了。去除以下物质:

@command('nickname')
def foo():
    print('bar')

看起来像这样:

def foo():
    print('bar')

foo = command('nickname')(foo)

因此,要编写接受参数的decorator,decorator需要返回一个函数,该函数接受要修饰的函数作为参数:

def command(nickname):
    def wrapped(f):
        ALLCOMMANDS[nickname] = f
        return f
    return wrapped

还可以考虑将ALLCOMMANDS作为命令的属性,而不是全局属性(UPPER_SNAKE通常是为常量保留的):

def command(nickname):
    def wrapped(f):
        command._functions[nickname] = f
        return f
    return wrapped

command._functions = {}

相关问题 更多 >

    热门问题