19

PEP 484で次の例を見たところです。

def greeting(name: str) -> str:
    return 'Hello ' + name

print(greeting('Martin'))
print(greeting(1))

予想どおり、これは Python 2 では機能しません。

  File "test.py", line 1
    def greeting(name: str) -> str:
                     ^
SyntaxError: invalid syntax

ただし、Python 3 では機能します。

Hello Martin
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print(greeting(1))
  File "test.py", line 2, in greeting
    return 'Hello ' + name
TypeError: Can't convert 'int' object to str implicitly

これは予想外でした。次の例でわかるように、実際には型をまだチェックしていません (実行されますが、例外はスローされません)。

def greeting(name: str) -> int:
    return 'Hello ' + name

print(greeting('Martin'))

の後に:関数の名前を指定する必要があるように見えますが、関数は無視されているようです。

def aha(something):
    print("aha")
    return something+"!"

def greeting(name: aha, foo) -> int:
    return 'Hello ' + name + foo

print(greeting('Martin', 'ad'))

の後の名前も同様のようです->

この型ヒンティング構文は何か他のものを使用していますか (Java モデリング言語がコメントを利用するなど)? この構文はいつ Python に導入されましたか? この構文で既に静的型チェックを行う方法はありますか? Python 2 の互換性は常に失われますか?

4

1 に答える 1

31

ここでは型ヒントは行われません。あなたがしたことは、注釈を提供することだけでした。これらはPEP 3107で導入されました (Python 3 のみで、Python 2 ではサポートされていません)。後で検査するために、引数に注釈を付け、値に任意の情報を返すことができます。

>>> greeting.__annotations__
{'name': <class 'str'>, 'return': <class 'str'>}

それ以外の場合は、ここではまったく相談されません。代わりに、関数の本体で文字列と整数値を連結しようとすると、エラー メッセージが表示されます。

>>> 'Hello ' + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

strこれは、 +int連結が失敗した理由に関する追加情報を提供することを目的としたカスタム タイプ エラーです。str.__add__ではない型のメソッドによってスローされstrます。

>>> ''.__add__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> ''.__add__(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'bool' object to str implicitly

PEP 484 では、これらの注釈を使用して、追加のツールを使用して実際の静的型チェックを行うことを提案していますが、PEP の紹介では次のように述べられています。

これらの注釈は通常の__annotations__属性を介して実行時に使用できますが、実行時に型チェックは行われません。代わりに、この提案では、ユーザーが自発的にソース コードを実行できる別のオフライン型チェッカーの存在を前提としています。基本的に、このような型チェッカーは非常に強力なリンターとして機能します。

原文強調。

PEP は、PEP 3107 アノテーションを使用する既存のツールに触発されました。具体的にはmypy プロジェクト(PEP 484 を採用することですぐにループバックします) だけでなく、PyCharm IDEおよびpytypedecl プロジェクトでの型ヒントのサポートも含まれます。この取り組みを開始するGuido van Rossum の元の電子メールとフォローアップの電子メールを参照してください

mypy は、注釈を前処理し、ソース コードをバイト コンパイルする前に注釈を削除することで Python 2 をサポートしているようですが、そうしないと、Python 2 で動作することを意図した Python コードの構文を通常は使用できません。

PEP 484では、通常の Python ファイルの隣にあるスタブ ファイルの使用についても説明しています。これらは.pyi拡張子を使用し、署名のみを含み (型ヒント付き)、メイン.pyファイルの注釈は自由のままにして、Python 2 で使用できるようにします (別の方法で Polyglot Python コードを作成した場合)。

于 2015-04-21T11:09:10.540 に答える