如何通过“Duck Typing”来区分元组和简单字符串?

时间:2013-04-09 15:02:34

标签: python python-2.7

我对编程比较陌生,所以请原谅,如果我将下面的内容称为Duck Typing,我会犯下一个荒谬的错误。

我有一个程序,它接收一个字符串一个元组(包含字符串)作为单个参数。

示例:

def proc(arg):
    try:
        arg is a tuple
        handle arg a tuple
    except:
        arg is a simple string
        handle it so

根据参数是否为元组,我希望函数的行为不同。

我不想输入检查,并希望使用try..except进程。

我考虑过尝试arg[0],但Python中的字符串也是对象,在这方面,它们的行为类似于元组并返回一些内容。

我可以在这做什么?

谢谢。

3 个答案:

答案 0 :(得分:5)

在你的情况下,我建议你不要尝试..除非你想根据变量的类型表现不同......

当你的行为不同时,你应该使用try..except。

来自我的评论:

  

您应该在代码期望事情发生时使用异常   总是这样,也不是。在这里,您希望代码表现出来   不同取决于变量,所以你不应该尝试..except,   而是检查它是什么

您可以使用isinstance

isinstance(x, tuple)

有关isinstancetype

之间的区别,请参阅this post

All about Duck Typing and Forgiveness


使用您的代码和我的答案来创建解决方案:

def proc(arg):
    if isinstance(arg, tuple):
        # handle as tuple
    elif isinstance(arg, str):
        # handle as str
    else:
        # unhandled?

答案 1 :(得分:1)

我认为你的错误(因为即使是经验丰富的程序员有时会这么做也不太“荒谬”)就在这里:

  

我有一个过程接收字符串或元组(包含字符串)作为单个参数...根据参数是否为元组,我希望函数的行为不同。

不要设计这样的功能。一个函数应该做一个的事情,如果你需要两个不同的东西,写两个函数:

def process_item(some_string):
def process_items(tuple_of_strings):

虽然python中没有明确的输入,但变量和参数应保持类型 - 也就是说,在程序的任何一点,你都应该能够知道每个变量的类型。冒着夸大一点的风险,我会说代码中的每个isinstance都是设计缺陷的标志。修复您的设计,不需要解决方法。

答案 2 :(得分:0)

无论如何你想要它:

>>> s='vd sd'
>>> t=('ds','')
>>> t+='34'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "str") to tuple
>>> s+='34'
>>>