1. ホーム
  2. パイソン

[解決済み】Pythonは強型付けされていますか?

2022-03-30 14:54:57

質問

Pythonは強い型付け言語であるというリンクに出会いました。

しかし、強い型付け言語では、このようなことはできないのでは?

bob = 1
bob = "bob"

強く型付けされた言語は、実行時の型変換を受け付けないのでは?もしかしたら、強型・弱型の定義が間違っている(あるいは単純化しすぎている)のかもしれませんね。

では、Pythonは強型付け言語なのか弱型付け言語なのか?

どのように解決するのか?

Pythonは強く、動的に型付けされます。

  • 強い の型付けは、値の型が予期せぬ方法で変化しないことを意味します。Perlで起こりうるように、数字だけを含む文字列が魔法のように数字になることはない。型が変わるたびに、明示的な変換が必要になります。
  • ダイナミック 型付けとは、変数に型がある静的な型付けとは対照的に、実行時のオブジェクト(値)に型があることを意味します。

あなたの例では

bob = 1
bob = "bob"

これは、変数に型がなく、任意のオブジェクトの名前を付けることができるためです。その後 bob=1 を見ると type(bob) を返します。 int しかし、その後に bob="bob" を返します。 str . (ただし type は通常の関数なので、引数を評価し、その値の型を返します)。

これは古いC言語の方言とは対照的で、弱く静的な型付けがされており、ポインタと整数はほとんど交換可能でした。(現代のISO Cは多くの場合変換が必要ですが、私のコンパイラはデフォルトでこの点についてはまだ甘いです)。

強い型付けと弱い型付けは、二者択一というより連続的なものであることを付け加えておかなければなりません。C++はCよりも型付けが強い(より多くの変換が必要)ですが、ポインタのキャストを使用することで型システムを覆すことができます。

Pythonのような動的言語における型システムの強さは、そのプリミティブとライブラリ関数が異なる型にどう対応するかによって決まる。例えば + は、2つの数値に対して動作するようにオーバーロードされています。 または 文字列と数値の組み合わせではありません。これは + は実装されましたが、言語のセマンティクスに従った必然性はあまりありません。実際 + を使えば、暗黙のうちに何でも数値に変換してくれます。

def to_number(x):
    """Try to convert function argument to float-type object."""
    try: 
        return float(x) 
    except (TypeError, ValueError): 
        return 0 

class Foo:
    def __init__(self, number): 
        self.number = number

    def __add__(self, other):
        return self.number + to_number(other)

クラスのインスタンス Foo は、他のオブジェクトに追加することができます。

>>> a = Foo(42)
>>> a + "1"
43.0
>>> a + Foo
42
>>> a + 1
43.0
>>> a + None
42

Pythonは強型であっても、型のオブジェクトを追加することは全く問題ありません。 intfloat という型のオブジェクトを返します。 float (例, int(42) + float(1) が返されます。 43.0 ). 一方、以下のようにすると、型の不一致のため、Haskellは文句を言うでしょう。 (42 :: Integer) + (1 :: Float) . このため、Haskellは厳密に型付けされた言語であり、型は完全に分離され、型クラスを介して制御された形でしかオーバーロードを行うことができないのです。