s = set([1,2,3])
私は次のことをエレガントにする必要があります。
a.update(s).update(s)
思ったように動作しませんset([1,2,3,1,2,3,1,2,3])
だから私はさまよっています Pythonはこの連鎖可能な実践を提唱していますか?
set.update()
が返さNone
れるので、そのような更新を連鎖させることはできません
Pythonの通常のルールは、変異するメソッドはオブジェクトを返さないというものです
str.replace()
チェーンできるような新しいオブジェクトを明らかに返す必要がある不変オブジェクトのメソッドとは対照的です
場合によります。
オブジェクトを変更するメソッドは通常返さNone
れるため、次のような一連のメソッドを呼び出すことはできません。
L.append(2).append(3).append(4)
そして、次と同じ効果があることを願っています:
L.append(2)
L.append(3)
L.append(4)
AttributeError
の最初の呼び出しがappend
戻りNone
、メソッドNone
がないため、おそらく取得します。append
新しいオブジェクトを作成するメソッドはそのオブジェクトを返します。たとえば、次のようになります。
"some string".replace("a", "b").replace("c", "d")
完全に大丈夫です。
通常、不変オブジェクトは新しいオブジェクトを返しますが、可変オブジェクトは戻りますNone
が、メソッドと特定のオブジェクトによって異なります。
とにかく、それは確かに言語自体の機能ではなく、メソッドを実装する方法にすぎません。連鎖可能なメソッドはおそらくどの言語でも実装できるため、「Pythonメソッドは連鎖可能か」という質問はあまり意味がありません。唯一の合理的な質問は「Pythonメソッドは常に/強制的に/などチェーン可能ですか?」であり、この質問への答えは「いいえ」です。
この例set
では、一意のアイテムのみを含めることができるため、表示する結果は意味がありません。おそらく単純なを使用したかったでしょうlist
。
はい、Pythonでメソッド呼び出しを連鎖させることができます。それが良い習慣であるかどうかに関しては、連鎖呼び出しの使用を提唱する多くのライブラリがあります。たとえば、SQLAlchemyのチュートリアルでは、このスタイルのコーディングを多用しています。次のようなコードスニペットに頻繁に遭遇します
session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()
採用する賢明なガイドラインは、コードを読みやすく、保守しやすくするかどうかを自問することです。常にコードを読みやすくするように努めてください。
簡単な例を書きます。連鎖可能なメソッドは、常にオブジェクトを返す必要がありますself
。
class Chain(object):
"""Chain example"""
def __init__(self):
self._content = ''
def update(self, new_content):
"""method of appending content"""
self._content += new_content
return self
def __str__(self):
return self._content
>>> c = Chain()
>>> c.update('str1').update('str2').update('str3')
>>> print c
str1str2str3
メソッドはではなく、値をupdate
返します。したがって、チェーン内
の別のメソッドを呼び出すことはできませんset
None
update
NoneType
したがって、これはとにかくエラーになります..
a.update(s).update(s)
ただし、 aには値Set
のみを含めることができるためunique
です。update
そのため、別の行で分離しても、必要Set
なようなものは得られません..