想象一下,我有以下两种方法:
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)
如果我愿意总是用关键字参数调用结果函数,我可以看到如何做到这一点,如果我愿意更改第二个函数的签名以接受列表,我可以看到如何做到这一点或三个参数的元组,以便每个版本都有单个参数,我可以按类型区分(在Python中似乎不太正确)。
我可以干净地编写一个允许我用一组位置参数调用它的函数吗?
答案 0 :(得分: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)
答案 1 :(得分: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]
...
答案 2 :(得分: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)是否有分支。
答案 3 :(得分:0)
我可以干净地编写一个允许我用一组位置参数调用它的函数吗?
我不这么认为。但这是另一个尝试接近的事情。
def fn(self, a, *args):
if args:
self.things.add(MyObject(*((a,) + args)))
else:
self.things.add(a)