2017-08-04 8 views
0

私は整数年を受け取る関数を持っていますが、文字列'ALL'を渡すことができ、何かを返すこともできます。お互いに頼っているが同じ結果につながる2つの条件を単純化するには?

私は今、このコードの醜い部分を持っている:

if type(year) != str or (type(year) == str and year.upper() != 'ALL'): 
    total_results = self.filterResultsByYear(total_results, year, year2) 

結果は現在の年に、デフォルトでフィルタリングされ、そして他の年によってフィルタリングすることができますが、ユーザーがフィルタリングないしたい場合、彼らが持っていますその年の「すべて」を渡す。

私が上記の忌み嫌いを書いた理由は、私がちょうどif year.upper() != 'ALL'を持っていれば、私は整数を渡すとTypeErrorが得られます。もし私がif type(year) != str and year.upper() != 'ALL'を置くと、私はまだ同じエラーが出ます。上記のコードは本当に醜いと私はそれをもっとpythonicにしたいと思った。これを行うにはどんなツールが必要ですか? total_resultsyear2があり、あなたがそれらを処理したいのか内容に応じて

+1

'year'が文字列であり、" all "でない場合に期待される動作は何ですか? – DyZ

+0

あなたは常に有効な入力を期待していますか?そうでない場合は、有効な年であるかどうかをチェックするか、フィルターをまったく適用しないでください。 – KGS

+0

@DYZ入力が無効であることをユーザーに警告するエラーを投げたい。基本的には、フィルターをデフォルトで適用し、ユーザーがintを提供する場合、ユーザーが文字列を指定し、その文字列が '' all''になった場合、フィルターを無視します。 – PolarBearITS

答えて

1

try: 
    year = int(year) 
    total_results = self.filterResultsByYear(total_results, year, year2) 
except ValueError: 
    if not isinstance(year, (str, unicode)): 
     raise # Not string, unicode or coercible to an integer. 
    if year.lower() == 'all': 
     # Your logic here. 
    else: 
     # String but not 'all'. Exception handling. 

さようなら方法は、1がisinstance(object, class)またはisinstance(object, (class 1, class 2, ...))使用するクラスの等価性をチェックします。

+0

私はコードフローを動作させたかったのは、年が '' all''に等しくなければフィルタが適用され、無視されます。デフォルトでは、フィルタが適用されます。 – PolarBearITS

関連する問題