2016-10-05 4 views
9

新しいPython 3.5モジュールtypingを使用していて楽しいです。タイピングモジュール - 文字列リテラルタイプ

正確な文字列リテラルに基づいてタイプを指定する方法が不思議でした。例えば、関数は "North"、 "West"、 "East"、 "South"の4つの文字列のいずれかを返すことが保証されています。

私はUnionタイプとTypeVar機能を見つけ、文書を通じて見えたが、答えを見つけることができませんでした

この問題表す例機能:。

def compute_quadrant(x: int, y: int) -> str: 
    if x > 0 and y > 0: 
     return 'I' 
    elif x < 0 and y > 0: 
     return 'II' 
    elif x < 0 and y < 0: 
     return 'III' 
    elif x > 0 and y < 0: 
     return 'IV' 

を代わりにちょうどstrを返すので、私は思います4つの値のうちの1つであるより具体的な型を返すのが好きです - "I","II","III"または"IV"である。 type Quadrant = "I" | "II" | "III" | "IV" - このユースケースではtypingモジュールでPythonの砂糖がありますか?

+5

入力に関係はありませんが、 'enum'とは考えていますか? –

+0

私は尋ねることができます、なぜあなたはそのようなものが必要ですか?タイプ注釈は、コードを表示するテキストエディタおよびプログラマのために作成されるためです。関数が返す可能性のある要素の範囲を制限することができれば、コードを見ることで間違いなくそのことを言うことができます。 –

+0

おそらく、この特定の関数はユースケースを簡単に説明しているわけではありませんが、コードを書くときにはできるだけ多くのコンテキストを提供したいと考えています。データを操作したりオブジェクトに対して複雑な操作を行う場合、非常に厳密で正確な型を提供できるようにしたいと考えています。さらに、分析ツールは、タイプに基づいて最適化のポイントを見つけることができます。たとえば、決してヒットしないコードパスや重要な間違いなどです。 – fructosewizard

答えて

1

あなたが尋ねたtypingモジュールを無視して、複数のコメントで想定されているEnumの使用が問題の解決策になる可能性があります。このコードは次のようになります。

from enum import Enum 

class Quadrant(Enum): 
    I = 1 
    II = 2 
    III = 3 
    IV = 4 

def compute_quadrant(x: int, y: int) -> Quadrant: 
    if x > 0 and y > 0: 
     return Quadrant.I 
    elif x < 0 and y > 0: 
     return Quadrant.II 
    elif x < 0 and y < 0: 
     return Quadrant.III 
    elif x > 0 and y < 0: 
     return Quadrant.IV 
    # return None # this is what happens without an else clause! 

if __name__ == "__main__": 
    quad = compute_quadrant(1, -1) 
    print(quad, type(quad))    # -> Quadrant.IV <enum 'Quadrant'> 
    print(quad.name, type(quad.name)) # -> IV <class 'str'> 
    print(quad.value, type(quad.value)) # -> 4 <class 'int'> 

ご覧のとおり、列挙型の名前と値を使用できます。名前はあなたが求めた文字列の1つです。

私がここに見る1つの問題は、関数内のmissing句と、Quadrantの有効な戻り値としてNoneを受け入れるというmypyの現在の動作です。これは手動で処理する必要があります。

関連する問題