Python中的灵活参数

2024-09-27 21:22:49 发布

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

这个问题以前可能有人问过,但我不知道如何查找答案,因为我不知道用什么方式来表达这个问题。在

主题是函数参数,在语义上可以用许多不同的方式表达。例如,要给函数一个文件,可以直接给文件,也可以给一个字符串,即文件的路径。要指定一个数字,可以允许使用整数作为参数,也可以允许使用字符串(数字),甚至可以允许使用诸如“one”之类的字符串。另一个例子可能是一个接受列表(比如说数字)的函数,但是为了方便起见,它将一个数字转换成一个包含一个元素的列表:那个数字。在

Python中是否有某种程度上的标准方法来允许这种灵活性?如果你不确定参数是什么类型,这无疑会使程序的代码复杂化,所以我的猜测是尝试将方便函数分解到一个地方,而不是分散在每个地方,但我真的不知道如何最好地进行这种分解。在


Tags: 文件函数字符串答案路径主题列表参数
3条回答

分解多个函数的公共代码的一个好方法是通过decorators。例如

from functools import wraps

def takes_list(func):
    @wraps(func)
    def wrapper(arg):
        if not isinstance(arg, list):
            arg = [arg]
        return func(arg)
    return wrapper

@takes_list
def my_func(x):
    "Does something with list x."

我应该注意到,对于像文件这样的情况,您不想妨碍Python的duck类型:进行检查isinstance(arg, file)有一个问题,即它不允许像io.StringIO这样的文件类型的东西。相反,检查str(或basestring),甚至让open为您检查,使用try except。在

但是,通常更好的做法是让调用者将他们喜欢的内容传递到函数中,如果函数无效则失败。在

不,在这方面没有或多或少的“标准”方法。在

  1. 别这样!;)

但如果你还想,我建议你有一个中间类或函数来处理这个问题:

伪代码:

def printTheNumber(num):
    print num


def intermediatePrintTheNumber(input):

    num_int_dict = {'one':1, "two":2 ....
    if input.isstring():
        printTheNumber(num_int_dict[input])
    elif input.isint():
        printTheNumber(input)
    else:
        print "Sorry Dave, I don't understand you"

如果这是pythonic我不知道,但是如果必须的话,我会解决它,当然,需要对输入进行更多的检查以确认它是有效的。在

当谈到你的评论时,你提到语义相似性,即"one"和{}可能意味着相同的事情。在

你要问,这种转换应该在哪里进行。在

这取决于你的系统设计,但是我可以告诉你,它不应该在我称为printTheNumber的同一个函数中完成,因为一个非常简单的原因,那就是这将赋予这个函数很大的责任。在

根据输入的复杂程度,它可以是integer 1或{},或者,在更糟的情况下,"one",甚至可能更糟{}。这应该由一个只负责处理映射的数据库来处理。在

我把它分开,这样我就有一个函数来处理字符串“一”、“二”。。。一个处理整数,第三个函数检查输入是否可以转换为整数。在

在我看来,如果你必须对这种复杂性采取措施,那么对于设计中的一个fundamental缺陷有一个警告,但你似乎意识到了这一点,所以我就不继续讨论了。在

相关问题 更多 >

    热门问题