Python类型比较

Python类型比较,python,instance,dynamic-typing,Python,Instance,Dynamic Typing,好的,我有一个元组列表,其中包含三个值(code,value,unit) 当我要使用它时,我需要检查一个值是str、列表还是矩阵。(或检查是否列表,然后再次检查是否列表) 我的问题是我应该这样做,还是有更好的方法 for code, value, unit in tuples: if isinstance(value, str): # Do for this item elif isinstance(value, collections.Iterable):

好的,我有一个元组列表,其中包含三个值
(code,value,unit)

当我要使用它时,我需要检查一个值是str、列表还是矩阵。(或检查是否列表,然后再次检查是否列表)

我的问题是我应该这样做,还是有更好的方法

for code, value, unit in tuples:
    if isinstance(value, str): 
        # Do for this item
    elif isinstance(value, collections.Iterable):
        # Do for each item
        for x in value:
             if isinstance(x, str):
                  # Do for this item
             elif isinstance(x, collections.Iterable):
                  # Do for each item
                  for x in value:
                      # ...
             else:
                  raise Exception
    else:
        raise Exception

这是可行的,但每次调用
isinstance
,您都应该问自己“我可以为
值添加一个方法吗?”,这会将代码更改为:

for (code,value,unit) in tuples:
    value.doSomething(code, unit)

要使其工作,您必须包装类型,如
str
,并在帮助器类型中列出实现
doSomething()

的列表,只需使用元组并捕获任何异常。不要三思而后行:)

最好的解决方案是避免混合这样的类型,但是如果您一直坚持这样做,那么您所编写的内容就可以了,除非我只检查
str
实例。如果它不是字符串或iterable,那么不管怎样,您都会得到一个更合适的异常,因此无需自己执行

for (code,value,unit) in tuples:
    if isinstance(value,str): 
        #Do for this item
    else:
        #Do for each item
        for x in value:
             if isinstance(value,str):
                  #Do for this item
             else:
                  #Do for each item
                  for x in value:

另一种方法是将此代码分解成更通用的生成器函数(假设Python 2.x):

(这还包括中建议和解释的简化。)

现在,您的代码变得非常简单易读:

for code, value, unit in tuples:
    for v in flatten(value):
        # whatever
分解代码也有助于在代码中的多个位置处理此数据结构。

递归将有所帮助

def processvalue(value):
  if isinstance(value, list): # string is type Iterable (thanks @sven)
    for x in value:
      processvalue(value)
  else:
    # Do your processing of string or matrices or whatever.


# Test each the value in each tuple.
for (code, value, unit) in tuples:
  processvalue(value)

这是处理嵌套结构的一种更简洁的方法,还将使您能够处理任意深度。

for
循环的外部
主体相当混乱。第一行不是应该有
x
而不是
value
?对于x中的y,内部循环不应该是类似于
的吗?我实际上不会对值做任何事情,而是将值分配给excelsheet。我相信像邓肯说的那样做对我来说更容易。我想你的意思是,请求原谅比获得允许更容易:)在这种情况下,我知道二维数组是最大的,我必须对它们进行索引,使用这种方法可能更难。我不明白你对它们进行索引是什么意思。
def processvalue(value):
  if isinstance(value, list): # string is type Iterable (thanks @sven)
    for x in value:
      processvalue(value)
  else:
    # Do your processing of string or matrices or whatever.


# Test each the value in each tuple.
for (code, value, unit) in tuples:
  processvalue(value)