2016-11-24 73 views
0

我想传递一个类型或一个类型列表作为参数的函数。但在函数内,我需要区分类型和类型列表。粗略地解释我需要某种形式的分支这样的:如何检查变量是否包含类型或类型列表?

if //someVar is a type//: 
    .... 
elif isinstance(someVar, list): 
    for t in list: 
     if //t is a type//: 
      .... 
     else: 
      print("ERROR") 
else 
    print("ERROR") 

类型可以是一些“原始”像INTSTR也是元组或班级为好。

问题:我该如何正确而有效地类型和类型列表区分?

+0

你能解释一下你想要做的事情吗?你是否看过'isinstance' /'issubclass'? – jonrsharpe

+0

你需要明确检查'list's?另外,什么*不符合您的类型? –

+0

澄清:我的意图是将类型信息传递给类型验证方法。我想给用户一些自由如何指定传递给这个方法的类型约束。因此,我希望允许他指定单一类型或类型列表(并且最终在将来还有其他一些选项)。因此,提供的信息将存储在一个变量中。因此,为了正确处理用户提供的信息,我需要在代码中进行某种分支。 –

回答

1

你需要提供一个tupleisinstance包含你认为是适当的“原始”的类型。对于列表,您只需通过list

如果您需要处理“类和”你需要在元组明确添加这些课程,因为在Python中(至少在Python 3没有ClassType,在Python 2老式类有一个普通类型)。

因此,给出的例子类Bar,这里是你将如何让strint S,tuple S和Bar为“原始”,同时进一步检查列表:

class Bar: pass 

def foo(arg): 
    if isinstance(arg, (int, str, tuple, Bar)): 
     print("type str or int or tuple or Bar") 
    elif isinstance(arg, list): 
     print("a list") 
    else: 
     print("Error") 

功能foo现在使这些区别对你:

>>> foo(1) 
type str or int or tuple or Bar 
>>> foo([1]) 
a list 
>>> foo(Bar()) 
type str or int or tuple or Bar 
>>> foo(foo) 
Error 

进一步elif子句中的分支为list s的同样performe d。

+0

没有类的常见类型...这很不方便。某些代码不能显式检查所有存在的类。请参阅上面提供的附加信息作为对我的问题的评论。你有什么想法如何实现这一目标?我需要明确地区分表示类型的对象(f.e.列表)和该类型的实例(f.e.类型的列表)。 –

+0

@Regis用户可以提供什么arg?输入:'foo(list)','foo(int)'属于“single”类型,而'foo([int,str,tuple])'属于'type'的'list'类别? –

+1

对不起,是的。 Jim给出了正确的提示:我可以将元组或单值传递给isinstance()。所以我可以实现我想要的。我可以完全跳过分支,因为这是通过isinstance()本身完成的!谢谢你的回答,吉姆! –

相关问题