如何使用相同的函数调用调用具有不等参数的两个函数?

时间:2012-01-13 06:08:01

标签: python

我有两个定义,

文件x.py:

class x:

    def p(self, a, b) :
        # ...

文件y.py:

class y:

    def p(self, a, b, c) :
        # [...]

现在我从另一个文件中调用这些函数。具有文件名(在本例中为x和y)的命令行输入在cust变量中传递。

文件z.py:

from x import  *
from y import  *

class z:

    cust.p(a, b, c)

x(或y)作为命令行输入传递给文件z.py.
cust是类z的类变量。

现在,cust = x对象出现错误:takes exactly 2 arguments (3 given)

但是当cust = y对象工作正常时。

如何消除此错误?

我不想修改x.py和y.py文件中的函数定义,因为有很多文件。

如何修改代码,以便从同一函数调用调用这两个函数而不修改函数定义?

5 个答案:

答案 0 :(得分:1)

更改您的方法,使两个...

中的第三个参数可选
class x:
  def p(a, b, c=None):
    """ c will be ignored. """
    print a, b


class y:
  def p(a, b, c=1234):
    """ c will be used, with a default of 1234. """
    print a, b, c

x().p(1, 2)
x().p(1, 2, 123)
y().p(1, 2)
y().p(1, 2, 123)

答案 1 :(得分:0)

基于我对代码和规范的理解(老实说,不太清楚),你想同时从两个文件中调用函数,并且你有一个名为cust的变量你把它们称为方法。

在指定cust之前,我无能为力。我也不确定它是如何同时成为xy类的。这个可能是你想要的:

#file x.py
class x:
    def p(self, a, b):
        ...

#file y.py
class y:
    def p(self, a, b, c):
        ...

#file z.py
from x import *
from y import *
my_x = x()
my_y = y()
a = ...
b = ...
my_x.p(a, b)
my_y.p(a, b, c)

我希望你能更具体地了解你想要什么,所以我可以提供帮助。

答案 2 :(得分:0)

快速而肮脏的答案是:

try:
   cust.p(a,b,c)
except TypeError:
   cust.p(a,b)

免责声明:原始问题的定义方式存在很多问题,因此这种方法似乎没有让事情变得更糟。

答案 3 :(得分:0)

如果您无法更改要调用的函数以使用*args**kwargs,则必须添加特殊情况以查看该对象的类:

if isinstance(cust, x):
    cust.p(a, b)
elif isinstance(cust, y):
    cust.p(a, b, c)

有关isinstance功能的详细信息,请参阅this link

答案 4 :(得分:0)

猴补丁。

x.p = lambda self, a, b, c=None: x.p(self, a, b)