0
s = set([1,2,3])

私は次のことをエレガントにする必要があります。

a.update(s).update(s)

思ったように動作しませんset([1,2,3,1,2,3,1,2,3])

だから私はさまよっています Pythonはこの連鎖可能な実践を提唱していますか?

4

5 に答える 5

1

set.update()が返さNoneれるので、そのような更新を連鎖させることはできません

Pythonの通常のルールは、変異するメソッドはオブジェクトを返さないというものです

str.replace()チェーンできるような新しいオブジェクトを明らかに返す必要がある不変オブジェクトのメソッドとは対照的です

于 2012-10-11T13:05:15.177 に答える
1

場合によります。

オブジェクトを変更するメソッドは通常返さ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

于 2012-10-11T13:05:50.593 に答える
0

はい、Pythonでメソッド呼び出しを連鎖させることができます。それが良い習慣であるかどうかに関しては、連鎖呼び出しの使用を提唱する多くのライブラリがあります。たとえば、SQLAlchemyのチュートリアルでは、このスタイルのコーディングを多用しています。次のようなコードスニペットに頻繁に遭遇します

session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all() 

採用する賢明なガイドラインは、コードを読みやすく、保守しやすくするかどうかを自問することです。常にコードを読みやすくするように努めてください。

于 2012-10-11T13:06:52.170 に答える
0

簡単な例を書きます。連鎖可能なメソッドは、常にオブジェクトを返す必要があります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
于 2012-10-11T13:07:42.703 に答える
0

メソッドはではなく、値をupdate返します。したがって、チェーン内 の別のメソッドを呼び出すことはできませんsetNone
updateNoneType

したがって、これはとにかくエラーになります..

a.update(s).update(s)

ただし、 aには値Setのみを含めることができるためuniqueです。updateそのため、別の行で分離しても、必要Setなようなものは得られません..

于 2012-10-11T13:03:51.263 に答える