我有两个定义,
文件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文件中的函数定义,因为有很多文件。
如何修改代码,以便从同一函数调用调用这两个函数而不修改函数定义?
答案 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
之前,我无能为力。我也不确定它是如何同时成为x
和y
类的。这个可能是你想要的:
#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)