2012-02-10 101 views
5

的是我想要做的基本思路是:如何为同一功能设置不同的输入类型?

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) 

我知道这种想法是可以在更OO型的语言,但是这也有可能在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

想要“在调用函数时清晰的区别”这一目标不会与语言的设计理念擦得太紧密。谷歌“鸭子打字”的更多信息。接受的输入应该由函数的文档字符串来表示,这就是你需要做的。

在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

+0

+1关于语言哲学的好处。另外我相信你应该改变'input'参数的名字(现在它覆盖了一个内置函数)。 – Tadeck 2012-02-10 10:29:24

6

具有相同的方法支持不同的参数类型被称为multiple dispatch or multimethods的想法。

为了得到一个很好的介绍,你可以阅读这个Guido Van Rossum article并看看PyPi,因为有几个multimethod packages可用。

+0

谢谢,我不知道名称(正在寻找多态性),应该有帮助 – 2012-02-10 09:58:20

0

你有什么基本的工作,只有一些变量声明的麻烦。这是一个工作vesrion:

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) 

看跌期权:

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 

您还可以发送到功能既是一个列表和字典(见What is a clean, pythonic way to have multiple constructors in Python?例如)非特异性参数。

+0

您的回答是错误的。你仍然可以用'aFunction([1,2,3])'调用'aFunction',它会假设你给它一个字符串(显然不是这样)以及'aFunction(dicti =“这不是一个字典“),它会假设你输入了一个字典。 @wim使用鸭子打字得到了正确的答案。给给定类型赋一个默认参数不会给你保证,因为Python是一种弱类型的语言,它可能在运行时改变。 – 2015-11-24 11:47:46

相关问题