我对编程比较陌生,所以请原谅,如果我将下面的内容称为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中的字符串也是对象,在这方面,它们的行为类似于元组并返回一些内容。
我可以在这做什么?
谢谢。
答案 0 :(得分:5)
在你的情况下,我建议你不要尝试..除非你想根据变量的类型表现不同......
当你的行为不同时,你应该使用try..except。
来自我的评论:
您应该在代码期望事情发生时使用异常 总是这样,也不是。在这里,您希望代码表现出来 不同取决于变量,所以你不应该尝试..except, 而是检查它是什么
您可以使用isinstance
。
isinstance(x, tuple)
有关isinstance
和type
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'
>>>