1

次の 2 つの方法があるとします。

 def function(self, my_object):
     self.things.add(my_object)

 def function_args(self, arg1, arg2, arg3 = None):
     my_object = MyObject(arg1, arg2, arg3)
     self.things.add(my_object)

これを、位置パラメーターで呼び出すことができる単一の関数として書きたいと思います。

 something.function(an_object)
 something.function(arg1, arg2, arg3)

結果の関数を常にキーワード引数で呼び出す場合は、その方法を確認できます。また、2 番目の関数のシグネチャを、次のリストまたはタプルを受け入れるように変更する場合は、その方法を確認できます。 3 つの引数で、各バージョンに 1 つの引数があり、型で区別できます (これは Python では正しくないようです)。

位置引数のいずれかのセットで呼び出すことができる単一の関数をきれいに書くことができますか?

4

4 に答える 4

1

arg2をオプションに設定し、関数が呼び出されたときにチェックしてみませんか?

 def function_args(self, arg1, arg2 = None, arg3 = None):
     if arg2 != None:
       my_object = MyObject(arg1, arg2, arg3)
       self.things.add(my_object)
     else:
       self.things.add(arg1)
于 2012-05-11T16:51:56.790 に答える
1

私はこのアイデアを非常にpythonicとは呼びませんが、次のようなものがうまくいきます:

def fun(*args):
    obj = args[0]
    if not isinstance(obj, MyClass):
        obj = MyClass(*args)

あなたの API が何であるかはわかりませんが、コメントでオブジェクトの再利用について言及したので、次のようにエンド ユーザーに透過的にすることができるかもしれません。

def fun(arg1, arg2, arg3=None):
    key = arg1 + arg2 + arg3
    if key not in cache:
        cache[key] = MyClass(arg1, arg2, arg3)
    obj = cache[key]
    ...
于 2012-05-11T16:58:59.370 に答える
0
def function(self, *args, my_object=None)
    if my_object is None:
        my_object =  MyObject(*args)
    self.things.add(my_object)

これには、my_objectをキーワード引数として渡す必要がありますが、IMOは、関連する魔法にヒントを与えるため、まさにこれが必要なものです。

キーワード引数が本当に必要ない場合は、それを削除し、len(args)の分岐を確認してください。

于 2012-05-11T16:52:21.463 に答える
0

位置引数のいずれかのセットで呼び出すことができる単一の関数をきれいに書くことができますか?

私はそうは思わない。しかし、ここで別の試みが近づいています。

def fn(self, a, *args):
    if args:
        self.things.add(MyObject(*((a,) + args)))
    else:
        self.things.add(a)
于 2012-05-11T17:32:21.910 に答える