6

変更されたオブジェクトを返すことができる関数、または単にインスタンスを変更する関数の Python での命名規則は何でしょうか。

両方を実装したいとしましょう。関数にどのように名前を付ける必要がありますか?

例: crop()Image オブジェクトの関数が必要だとします。crop()コピーを返すcrop!()場合と元のインスタンスを変更する場合に使用する必要があるため、Ruby は簡単でした。

4

4 に答える 4

5

一部のPEPに正確なガイドラインがあるかどうかはわかりませんが、特定の関数/メソッドがpythonコアでどのように機能するかを見て、私は個人的に動詞活用を使用しています。たとえば、次のようにインスパイアされました。

>>> l = list('hello world')
>>> l
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> sorted(l)
[' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
>>> l
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> l.sort()
>>> l
[' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']

あなたの関数にcrop()[オブジェクトをその場で変更する] とcropped()[変更されたコピーを返す] という名前を付けます。

EDIT:私はルビーを知りませんが、Pythonでは、2つの違いは純粋に従来のものです(関数/メソッドの動作は、呼び出し方とは無関係です)。

チッ!

于 2011-11-21T12:40:58.220 に答える
2

標準ライブラリには、 in placeを変更するlist.sort()やのようなメソッドと、何か新しいものを返す (新しいリストではなくイテレータを返す)やのような関数があります。しかし、関数よりもインスタンス メソッドを使用する方が理にかなっている場合、この規則を守るためだけにこれを行うことはありません。list.reverse()listsorted()reversed()reversed()

NumPy では、多くの関数とメソッドにoutキーワード引数があり、新しい配列を作成するのではなく、既存の配列に出力するように指定できます。out配列を入力配列の 1 つにすることもできます。

于 2011-11-21T12:45:11.133 に答える
1

このAFAIKには「Python全体」の規則はありません。ただし、私が取り組んでいるプロジェクトには、役に立つかもしれない規則があります。関数がその引数をその場で変更できる場合、copyその入力のコピーで動作するかどうかを決定する kwarg があり、デフォルトはTrueです。

def crop(x, copy=True):
    if copy:
        x = x.copy()
    _do_inplace_crop(x)
    return x
于 2011-11-21T12:41:07.897 に答える
0

何かをその場で変更可能にしたい場合は、メソッドを記述します。

smth.crop()

変更されたオブジェクトを返したい場合は、次の関数を使用します。

crop(smth)

そうすれば、関数を関数型スタイル (副作用なし) に保ち、メソッドを OOP スタイル (副作用あり) に保つことができます。

ただし、Python が許可され、関数名に Ruby や Lisp のような文字が含まれていることも望ま!?ます。

于 2011-11-21T12:47:29.960 に答える