这个问题以前可能有人问过,但我不知道如何查找答案,因为我不知道用什么方式来表达这个问题。在
主题是函数参数,在语义上可以用许多不同的方式表达。例如,要给函数一个文件,可以直接给文件,也可以给一个字符串,即文件的路径。要指定一个数字,可以允许使用整数作为参数,也可以允许使用字符串(数字),甚至可以允许使用诸如“one”之类的字符串。另一个例子可能是一个接受列表(比如说数字)的函数,但是为了方便起见,它将一个数字转换成一个包含一个元素的列表:那个数字。在
Python中是否有某种程度上的标准方法来允许这种灵活性?如果你不确定参数是什么类型,这无疑会使程序的代码复杂化,所以我的猜测是尝试将方便函数分解到一个地方,而不是分散在每个地方,但我真的不知道如何最好地进行这种分解。在
分解多个函数的公共代码的一个好方法是通过decorators。例如
我应该注意到,对于像文件这样的情况,您不想妨碍Python的duck类型:进行检查
isinstance(arg, file)
有一个问题,即它不允许像io.StringIO
这样的文件类型的东西。相反,检查str
(或basestring
),甚至让open
为您检查,使用try except。在但是,通常更好的做法是让调用者将他们喜欢的内容传递到函数中,如果函数无效则失败。在
不,在这方面没有或多或少的“标准”方法。在
但如果你还想,我建议你有一个中间类或函数来处理这个问题:
伪代码:
如果这是
pythonic
我不知道,但是如果必须的话,我会解决它,当然,需要对输入进行更多的检查以确认它是有效的。在当谈到你的评论时,你提到语义相似性,即}可能意味着相同的事情。在
"one"
和{你要问,这种转换应该在哪里进行。在
这取决于你的系统设计,但是我可以告诉你,它不应该在我称为
printTheNumber
的同一个函数中完成,因为一个非常简单的原因,那就是这将赋予这个函数很大的责任。在根据输入的复杂程度,它可以是},或者,在更糟的情况下,}。这应该由一个只负责处理映射的数据库来处理。在
integer 1
或{"one"
,甚至可能更糟{我把它分开,这样我就有一个函数来处理字符串“一”、“二”。。。一个处理整数,第三个函数检查输入是否可以转换为整数。在
在我看来,如果你必须对这种复杂性采取措施,那么对于设计中的一个
fundamental
缺陷有一个警告,但你似乎意识到了这一点,所以我就不继续讨论了。在相关问题 更多 >
编程相关推荐