1

単一のオブジェクトまたはオブジェクトのリストを受け入れるメソッドがあります。渡されたものを別のリストに追加したい。現在、私の方法は次のようになります。

def appendOrExtend(self, item):
  if type(item).__name__ == "list":
    self.list.extend(item)
  else:
    self.list.append(item)

これを達成するためのよりPython的な方法があるべきだと私には思えますが、提案してもらえますか?

4

5 に答える 5

10
def append(self, item):
    self.list.append(item)
def extend(self, item):
    self.list.extend(item)

結論:両方を行う方法はありません。それは混乱を招き、あなたの方法をより有用ではなく、より有用でなくします。また、テストと保守も困難です。また、関数のユーザーは、追加または拡張のどちらを使用するかをすでに知っているため、単一のメソッドを提供することで、呼び出し元/ユーザーがすでに知っている情報を破棄します。

別の記述方法は、パッキング/アンパック引数構文を使用することです。

def append(self, *items):
    self.list.extend(items)

そうすれば、メソッドを次のように呼び出すことができます

x.append('single item')

また

x.append(*list_of_items)
于 2010-10-25T13:38:23.007 に答える
3
if isinstance(item, list):
于 2010-10-25T13:31:00.070 に答える
1

Zach は型をよりエレガントにチェックするためのソリューションを提供します。ただし、2 つの別々の方法addOneElementaddMoreElements(または同様のもの) を紹介します。これにより、私の目にははるかに読みやすくなっています。

于 2010-10-25T13:35:16.067 に答える
1

セットとタプルを処理できるようにしたい場合は、それらを追加できます。本当に柔軟であるためには、反復可能なものは何でも取得する必要がありますが、個別に取得したいがたまたま反復可能である文字列やその他のオブジェクトによって混乱するリスクがあります。すぐに誰かがこれは悪い考えだと言うだろうし、おそらく彼らは正しいだろう - あなたのインターフェースの柔軟性があまりにも大きいため、あいまいになってしまう.

于 2010-10-25T13:36:01.907 に答える
0

if テストを維持しながらこれを行うこともできます。

if not isinstance(item, list):
    item = [item]
self.list.extend(item)
于 2010-10-25T13:49:11.833 に答える