2017-11-07 7 views
1

関数内にある可能性のあるすべてのケースをチェックしてもMyPyエラー "Missing return statement"MyPyはすべてのケースがテストされていても "Return statementがありません"というエラーを表示します

たとえば、次のコードでは、MyPyはまだcolorのみColor.REDColor.GREEN、またはColor.BLUEことができたとしても、私にエラー"9: error: Missing return statement"を与えている、と私はすべてのこれらのケースをテスト!

class Color(enum.IntEnum): 
    RED: int = 1 
    GREEN: int = 2 
    BLUE: int = 3 


def test_enum(color: Color) -> str: 
    if color == Color.RED: 
     return "red" 
    elif color == Color.GREEN: 
     return "green" 
    elif color == Color.BLUE: 
     return "blue" 
+0

「カラー」が3つのケースのいずれにも等しくない場合は、ケースを処理しませんでした。例えば、 'color'は' 'あなたが私を逃したhahaha ''と同じです。 – Sraw

+0

何も返さないコードにはパスがあります(つまり、 'color'がチェックしている色でない場合)。最後の 'elif'を無条件' else'に変更するか、エラーをスローする、またはエラーコードを返す新しい 'else'を追加することができます。 –

+1

あなたの直感は正しいです。 Swiftのような言語では、Swiftコンパイラが列挙型の可能なオプションを解釈するため、これは完全に有効です。私の推測では、MyPyは(まだ)それをしていないし、単純に文字列値を列挙型コンテキストを完全に認識しない文字列値と比較しているということです。 –

答えて

2

本当にこの質問には疑問はありません。実際、この時点でmypyはこのように動作しています。列挙型サポートは焼き付けられており、予備的であり、ややアドホックです。あなたが探している検査の種類は、将来実施される可能性があります。

ただし、このコードは脆弱です。色が変わると、それは静かに壊れます。 Pythonはコンパイルされた言語ではないことを覚えておいてください - 型チェッカーのパスはオプションで、他の人はそれを使用しないかもしれません。

正しい方法は、最後にassert Falseを追加することです。これはまた、ミーピーを沈黙させるでしょう。

関連する問題