web-dev-qa-db-ja.com

Pythonでの関数のオーバーロード:欠落

これが言うように:

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

Pythonでは、関数のオーバーロードはありません。

OO言語であるため、これが大きなハンディキャップであると感じている限り。最初は、引数の型を区別できないことは難しいが、Python簡単にしました(リスト、タプル、文字列は非常に似ています)。

ただし、渡された引数の数をカウントしてからジョブを実行するのは、やり過ぎのようです。

61
Xolve

解き明かしたように、デフォルト値を持つキーワード引数は長い道のりを歩むことができます。

また、私の意見では、Pythonの精神に反して、メソッドにどの型が渡されるかについて多くのことを心配します。Pythonでは、ダックタイピングを使用する方がより受け入れられていると思います。 -オブジェクトが何であるかではなく、何ができるかを尋ねる。

したがって、メソッドが文字列またはタプルを受け入れる場合、次のようなことを行うことができます。

def print_names(names):
    """Takes a space-delimited string or an iterable"""
    try:
        for name in names.split(): # string case
            print name
    except AttributeError:
        for name in names:
            print name

その後、次のいずれかを実行できます。

print_names("Ryan Billy")
print_names(("Ryan", "Billy"))

そのようなAPIは時々設計上の問題を示しますが。

33
Ryan Ginstrom

ここで、Python構文を使用してC++コードを記述しようとしない限り、何のためにオーバーロードが必要ですか?

私はそれはまったく逆だと思います、オーバーロードは強く型付けされた言語をよりPythonのように振る舞うために必要です。 Pythonキーワード引数がある場合、*argsおよび**kwargs

例: Pythonで複数のコンストラクターを使用するPythonのクリーンな方法は何ですか?

36
vartec

* args引数と** kwargs引数があるため、関数のオーバーロードは必要ありません。

実際、関数のオーバーロードは、異なる型を渡すと異なるコードを実行するという考えに基づいています。 pythonのような動的に型付けされた言語を使用している場合は、型で区別するべきではありませんが、インターフェイスと、記述するコードへの準拠を処理する必要があります。

たとえば、整数または整数のリストのいずれかを処理できるコードがある場合は、それを繰り返し試してみてください。できなければ、整数であると仮定して先に進みます。もちろんフロートでも構いませんが、振る舞いに関する限り、フロートとintが同じに見える場合は、それらを交換できます。

22
Stefano Borini

多くの場合、代わりにキーワードの引数を使用し、デフォルト値を使用することが推奨されています。それを見てください。

6
unwind

可変コンテナデータ型を関数に渡すことができます。必要なものを含めることができます。

異なる機能が必要な場合、関数に異なる名前を付けるか、Uが同じインターフェースを必要とする場合は、受信したデータに基づいて適切に関数を呼び出すインターフェース関数(またはメソッド)を記述してください。

これがJavaから来ることに慣れるのに時間がかかりましたが、実際には「大きなハンディキャップ」ではありません

6
Lakshman Prasad