3

公開しようとしている API を書いているとしましょう。APIの関数quuxは、タプルのリストまたはジェネレーターを返しますyield (foo, bar)

クライアントコードは通常、次のように使用します。

for foo, bar in quux(whatever):
    # do stuff with foo and bar

ここで、将来、および とbaz一緒に戻りたいと思うかもしれないとします。YAGNI がそうでないことが証明されるまでは、今すぐ返品したくありません。foobar

そのような将来の変更がクライアント コードを壊さないようにする (しようとする) 最善の方法は何でしょうか?

私は、Python 3 では人々が次のようなことを行うことができることを知っています。Python for foo, bar, *idontcare in quux(whatever)2 では、常にユーティリティ関数を記述できます (このように使用するためfor foo, bar in iterleft(quux(whatever), 2)):

def iterleft(iterable, limit):
    for item in iterable:
        yield item[:limit]

しかし、このようなことを行うためのより良い方法があるかどうか疑問に思っていました.

4

2 に答える 2

5

問題は、データとともに渡していないセマンティックデータ(「タプルの最初の要素はxを意味し、2番目の要素はyを意味します...」)があることです。

{"foo": foo, "bar": bar, ...}これを解決する一般的な方法は、パラメーターのディクショナリを返すことです。もちろん、タプルの解凍は使用できません。

それ以外の場合、下位互換性を維持するために変更することはできませんquux。代わりに、タプルquux_with_barを生成するように記述してから、その最初の2つの要素をフィルター処理するだけで済みます。(foo, bar, baz)quux

于 2012-11-20T14:31:42.660 に答える