如何让同一个函数接受不同的输入类型?

8
我想要做的基本思路是:
def aFuncion(string = '', dicti = {}):
    if len(str) > 0:
         print 'you gave string as input'
    if len(dicti) > 0:
         print 'you gave a dict as input'

aFunction(string = 'test')
dict['test'] = test
aFunction(dicti = dict)

我知道这种想法在更面向对象的语言中是可能的,但在Python中也可以实现吗?

目前我正在进行

def aFuncion(input):
    if type(input) == str:
         print 'you gave string as input'
    if type(input) == dict:
         print 'you gave a dict as input'

aFunction('test')

但我希望在调用函数时,能清晰地区分这些差异。

3个回答

8

谢谢,我不知道名字(一直在看多态性),这应该有所帮助。 - Niek de Klein

4
这个想要“在函数被调用时清楚差异”的目标与该语言的设计哲学不太搭配。请搜索“鸭子类型”了解更多信息。函数的文档字符串应明确指出接受的输入,这就是你需要做的全部。在Python中,如果你希望输入是字符串或字典,则只需编写代码,假定输入将是以字符串方式或字典方式进行操作的对象。如果输入不是这样的对象,则可以尝试优雅地处理它,但通常可以让代码简单地弹出未处理的异常。这把球交回给调用者,让他们决定如何处理情况,或意识到他们正在发送错误数据。一般应避免使用类型检查,如果真的必要,应使用`isinstance`而不是类型的等式检查,这具有更好的继承灵活性。
def aFuncion(input_):
    if isinstance(input_, str):
        print 'you gave a string-like input'
    elif isinstance(input_, dict):
        print 'you gave a dict-like input'

aFunction('test')

在Python3中,您现在有另一种选择,即使用类型提示函数注释。阅读PEP 484以了解更多关于该功能的详细信息。

+1 对于语言哲学的观点很好。此外,我认为您应该更改“input”参数的名称(现在它会覆盖内置函数)。 - Tadeck

0

你的代码基本上是可以工作的,只是变量声明方面有些问题。这里是一个可行的版本:

def aFunction(str = '', dicti = {}):
    if len(str) > 0:
         print 'you gave string as input'
    if len(dicti) > 0:
         print 'you gave a dict as input'

str = 'test'
dicti = dict([('test', 'test')])
aFunction(str = str)
aFunction(dicti = dicti)
aFunction(str = str, dicti = dicti)
aFunction(dicti = dicti, str = str)

puts:

you gave string as input
you gave a dict as input
you gave string as input
you gave a dict as input
you gave string as input
you gave a dict as input

你也可以将非特定参数作为列表和字典同时传递给函数(例如,请参见Python中具有多个构造函数的干净、Pythonic的方法是什么?)。


你的答案是错误的。你仍然可以调用aFunction,例如:aFunction([1,2,3]),它会假设你给了它一个字符串(显然不是这种情况),以及aFunction(dicti="this is not a dict"),它会假设你输入了一个字典。@wim 给出了正确的答案,使用了鸭子类型。给定类型分配默认参数并不能保证结果,因为Python是一种弱类型语言,它可能在运行时发生变化。 - Diogo Martins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接