web-dev-qa-db-ja.com

Pythonにlist.clear()メソッドがないのはなぜですか?

この質問。

Pythonにlist.clear()メソッドがないのはなぜですか?正しい方法は次のいずれかであるという質問をいくつかここで見つけましたが、それだけの方法がない理由は誰も言っていません。

del lst[:]
lst[:] = []

何かを行う方法が複数あることは「zen of python」に反するかもしれませんが、「list.clear()」メソッドを持っていることは、私には確かにより明白に思えます。また、どちらも.clear()を持つディクトおよびセットと一致します。

これに関するpython-devとpython-ideasへの投稿をいくつか見つけましたが、明確な答えはありませんでした( here (2006)および here (2009を参照)。 ))。グイドはそれに加重しましたか?これは、過去4〜5年間でまだ解決されていない論点にすぎませんか?

更新:list.clear()がpythonに追加されました- ここを参照

39
job

あなたがリンクしたスレッドで Raymond Hettingerはそのメソッドを追加することの賛否両論 をほぼまとめています。言語設計に関しては、保守的であることが非常に重要です。たとえば、C#チームの "すべての機能は-100ポイントで開始" 原則を参照してください。 Pythonのように機能を自由に追加しても、それほどきれいではありません。人気の高いスクリプト言語のいくつかを見て、それがどこにあるかを確認してください。

.clear()メソッドは、暗黙の-100ポイントのルールを超えてコア言語に追加する価値のあるものになったことはないと思います。 methodnameはすでに同等の目的で使用されており、代替を見つけるのが難しい場合があることを考えると、おそらくそれほど遠くないわけではありません。

18
Ants Aasma

この質問が尋ねられたときはlist.clear()はありませんでしたが、3.3には1つあります( http://bugs.python.org/issue10516 で要求されています)。さらに、clear()メソッドが bytearray および MutableSequence に追加され、リストと他のコレクション(セット、辞書など)。

変更の詳細は here を参照してください。

14
Jacek Sieka

その理由には答えられません。ただし、必ず1つは存在する必要があるため、同じインターフェイスで異なるタイプのオブジェクトをクリアできます。

明白で単純な例:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    reqs.clear()

これは、オブジェクトが反復をサポートし、clear()をサポートすることのみを必要とします。リストにclear()メソッドがある場合、これはリストを受け入れるか、同等に設定できます。代わりに、セットとリストにはコンテンツを削除するための別のAPIがあるため、機能しません。あなたは次のように不必要に醜いハックをしてしまいます:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    if getattr(reqs, "clear"):
        reqs.clear()
    else:
        del reqs[:]

私に関する限り、del obj [:]またはobj [:] = []を使用することは、リストにclear()がないという事実を回避するための、不快で直観的でないハックです。

これは、「冗長性の削減」を障害に導き、言語のconsistencyに損傷を与えます。これはさらに重要です。

どちらを使用するかについては、del obj [:]をお勧めします。リストに似ていないオブジェクトに対して実装する方が簡単だと思います。

7
Glenn Maynard

テスト時には、テストのドメインを形成するデータをグローバル変数に設定すると、テストが必要に応じて/より簡単に相互に構築できるようになることがよくあります。このような場合、リストをクリアするメソッドがあれば、関数(つまり、テスト)内でこれらの変数をグローバルとして宣言する必要なく、リストをクリアできます。テストは互いに依存すべきではない...

0
Pynchia