2016-11-24 11 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") 

タイプのいずれかができint型またはstrののようないくつかの「原始的」であるだけでなく、同様にタプルやクラス:大雑把に私はこのような分岐のいくつかの種類を必要と説明しました。

質問:タイプとタイプのリストを正確かつ効率的に区別するにはどうすればよいですか?

+0

あなたがしようとしていることのより広いコンテキストについて説明できますか?見たことがありますか? 'isinstance' /' issubclass'? – jonrsharpe

+0

'list'sを明示的にチェックする必要がありますか?また、*あなたのための型にはならない*ものはありませんか? –

+0

説明のために:私の意図は型情報を型検証メソッドに渡すことです。このメソッドに渡される型制約を指定する方法をユーザーに何らかの自由を与えたいと思います。そのため私は彼に単一のタイプまたはタイプのリスト(そして将来的にはいくつかの他のオプション)を指定させたいと考えています。そのため、提供される情報は単一の変数に格納されます。結果として、ユーザーが提供する情報を正しく処理するために、コード内で何らかの分岐が必要になります。 –

答えて

1

「プリミティブ」として適切と思われるタイプを含むtupleisinstanceを入力する必要があります。リストの場合は、listを渡すだけです。

あなたは2旧スタイルクラスが持っていたPythonで、少なくともPythonの3でのPython(にはClassTypeがないので、あなたが明示的にタプルでこれらのクラスを追加する必要があります「だけでなくクラス」を処理する必要がある場合一般的なタイプ)。

したがって、たとえばクラスBar与えられ、ここでさらにリストをチェックしながら、あなたは「原始的」としてstrint秒、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は今のところこれらの区別を作りますあなた:同様performeさlist秒間elif節に分岐

さらに
>>> 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 

d。

+0

クラスの一般的なタイプはありません...それはかなり不便です。コードの一部は、存在するすべてのクラスに対して明示的にチェックできません。私の質問へのコメントとして上記の追加情報をご覧ください。どのようにこれを達成するためのアイデアはありますか?私は明示的に型(例:リスト)を表すオブジェクトとその型のインスタンス(f.e.型のリスト)を区別する必要があります。 –

+0

@RegisMayユーザーはどんなargを供給しますか? 'foo(list)'、 'foo(int)'は '' type''の 'category'に属し、' foo([int、str、tuple]) 'は' type'の 'list'に属します。カテゴリ? –

+1

申し訳ありません。ジムは正しいヒントを与えました:私はタプルまたは単一の値をisinstance()に渡すことができます。だから私は私が望むものを正確に達成することができます。これはisinstance()自体によって行われるので、私は完全に分岐をスキップすることができます!あなたの答え、ジムありがとう! –

関連する問題