3

我对编程比较陌生,所以如果我犯了一个荒谬的错误,请原谅我将以下内容称为 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 中的字符串也是对象,在这方面它们的行为类似于元组并返回一些东西。

我可以在这里做什么?

谢谢你。

4

3 回答 3

5

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

当你没有表现出不同的行为时,你应该使用 try..except。

从我的评论:

当您的代码期望事物始终以相同的方式运行而并非如此时,您应该使用异常。在这里,您希望代码根据变量表现不同,因此您不应该尝试..except,而是检查它是什么

您可以使用isinstance.

isinstance(x, tuple)

请参阅这篇文章isinstance了解和之间的区别type

关于鸭子打字和宽恕


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

def proc(arg):
    if isinstance(arg, tuple):
        # handle as tuple
    elif isinstance(arg, str):
        # handle as str
    else:
        # unhandled?
于 2013-04-09T15:03:12.307 回答
1

我认为你的错误(不是很“荒谬”,因为即使是有经验的程序员有时也会犯)在这里:

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

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

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

尽管在 python 中没有明确的类型,变量和参数应该保持类型——也就是说,在你程序的任何时候你都应该能够知道每个变量是什么类型。冒着夸大的风险,我想说isinstance代码中的每一个都是设计缺陷的标志。修复您的设计,将不需要变通方法。

于 2013-04-09T15:33:40.267 回答
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'
>>>
于 2013-04-09T15:14:37.097 回答