英文:
How to pass arguments to a method called from another module?
问题
使用模块B时,我想从模块A调用方法merge_input_data()
,将当前B实例中的参数(self.input_1, self.input_2, self.input_3
)传递给A中的方法,并执行带有这些参数的merge_input_data()
功能。然而,我一直得到以下错误:
> All objects passed were None
我想问一下是否有一种方法可以调用其他模块/类的方法,而不必显式列出它们所有要传递的参数,例如 merge_input_data(self.input_1, self.input_2, self.input_3)
?这是因为模块A中的方法通常只接受self
作为参数,因为它在A的实例中提供,但我想从另一个模块B中访问它。谢谢!
可以通过以下方式在模块B中调用模块A的方法merge_input_data()
并传递参数,而无需显式列出它们:
# 在模块B中导入模块A中的Transaction类
from A import Transaction
# 创建Transaction类的实例
collection = Transaction()
class TestTransaction(object):
def __init__(self, path):
# 初始化TestTransaction实例
self.path = path
self.input_1 = None
self.input_2 = None
self.input_3 = None
self.input_merged = None
self.output = None
def import_test_input_data(self):
# 在这里调用模块A的方法import_input_data_x,并传递相应参数
self.input_1 = collection.import_input_data_1()
self.input_2 = collection.import_input_data_2()
self.input_3 = collection.import_input_data_3()
def test_merge_input_data(self):
# 在这里调用模块A的方法merge_input_data
collection.merge_input_data()
def main(self):
# 在main方法中调用import_test_input_data和test_merge_input_data
self.import_test_input_data()
self.test_merge_input_data()
这种方式允许您在模块B中调用模块A的方法,并使用模块A实例的方法来处理相应的参数,而无需显式传递它们。
英文:
I have the following two modules (simplified):
# Module A
class Transaction:
def __init__(self, path, ):
self.logger = logging.getLogger("Transaction")
logging.basicConfig(level=logging.DEBUG)
self.path = path
self.input_1 = None
self.input_2 = None
self.input_3 = None
self.input_merged = None
self.output = None
def import_input_data_1(self):
self.input_1 = pd.read_excel(
self.path
+ country.__data_paths__["collection"]["input"]["transaction"][
"fy2"
],
index_col=False,
engine="openpyxl",
dtype=object,
)
return self.input_1
def import_input_data_2(self):
self.input_2 = pd.read_excel(
self.path
+ country.__data_paths__["collection"]["input"]["transaction"][
"fy1"
],
index_col=False,
engine="openpyxl",
dtype=object,
)
return self.input_2
def import_input_data_3(self):
self.input_3 = pd.read_excel(
self.path
+ country.__data_paths__["collection"]["input"]["transaction"][
"fy"
],
index_col=False,
engine="openpyxl",
dtype=object,
)
return self.input_3
def merge_input_data(self):
self.input_merged = pd.concat(
[self.input_1, self.input_2, self.input_3]
)
return self.input_merged
def main(self):
self.logger.info("Loading input data 1")
self.input_1 = self.import_input_data_1()
self.logger.info("Loading input data 2")
self.input_2 = self.import_input_data_2()
self.logger.info("Loading input data 3")
self.input_3 = self.import_input_data_3()
self.logger.info("Merging input data")
self.input_merged = self.merge_input_data()
# Module B
from A import Transaction
collection = Transaction()
class TestTransaction(object):
def __init__(self, path):
logging.basicConfig(level=logging.DEBUG)
self.path = path
self.input_1 = None
self.input_2 = None
self.input_3 = None
self.input_merged = None
self.output = None
def import_test_input_data(self):
self.input_1 = pd.read_excel(
self.path
+ test.__data_paths__["collection"]["test"]["input"][
"fy2"
],
index_col=False,
engine="openpyxl",
dtype=object,
)
self.input_2 = pd.read_excel(
self.path
+ test.__data_paths__["collection"]["test"]["input"][
"fy1"
],
index_col=False,
engine="openpyxl",
dtype=object,
)
self.input_3 = pd.read_excel(
self.path
+ test.__data_paths__["collection"]["test"]["input"][
"fy"
],
index_col=False,
engine="openpyxl",
dtype=object,
)
return self.input_1, self.input_2, self.input_3
def test_merge_input_data(self) -> None:
collection.merge_input_data()
def main(self):
self.input_1, self.input_2, self.input_3 = self.import_test_input_data()
self.input_1, self.input_2, self.input_3 = self.merge_input_data()
Using module B, I want to call the method merge_input_data()
from module A, pass arguments from my current instance in B (self.input_1, self.input_2, self.input_3
) to the method in A and execute the functionality of merge_input_data()
with these arguments. However, I keep getting the error:
> All objects passed were None
I want to ask if there is a way to call methods from other modules / classes without them having all to-be-passed arguments explicitly listed, e.g. merge_input_data(self.input_1, self.input_2, self.input_3)
? This is because the method from module A usually only takes self
as an argument due to it being provided in the instance of A itself, but I want to access it from another module B. Thanks!
答案1
得分: 2
你可以使用 @staticmethod
来创建属于类的函数,这些函数不需要类的属性。
例如:
# 模块 A
class Collection:
def _merge_input_data(self):
self.input_merged = self.merge_input_data(self.input_1, self.input_2, self.input_3)
@staticmethod
def merge_input_data(*args):
return pd.concat(list(args))
# 模块 B
from 模块A import Collection
class Testing:
def test_merge_input_data(self):
result = Collection.merge_input_data(FIRST, SECOND, THIRD, ...)
我已经添加了函数 Collection._merge_input_data
,它可以用于类的实例。但是你没有提供所有的代码,所以我不确定你是否从你的类中使用了这个函数。
另外,在模块 B 中,你应该提供一个输入列表来进行合并。
英文:
You can use @staticmethod
to create function belonging to a class which do not need the attributes of a class.
For example:
# Module A
class Collection:
def _merge_input_data(self):
self.input_merged = self.merge_input_data(self.input_1, self.input_2, self.input_3)
@staticmethod
def merge_input_data(*args):
return pd.concat(list(args))
# Module B
from Module A import Collection
class Testing:
def test_merge_input_data(self):
result = Collection.merge_input_data(FIRST, SECOND, THIRD, ...)
I have add the function Collection._merge_input_data
which can be used for an instance of the class. But you did not provide all the code so I am not sure of you used this function from your class or not.
Also in module B you should provide a list with inputs to merge.
答案2
得分: 1
看起来你想要用测试数据替换真实的数据,这是class Transaction
在其import_input_data_x()
方法中收集的数据。
看起来你已经在测试类中的import_test_input_data()
方法中准备好了这些数据。
你应该使用这些数据:
def test_merge_input_data(self) -> None:
self.import_test_input_data()
collection.input_1 = self.input_1
collection.input_2 = self.input_2
collection.input_3 = self.input_3
collection.merge_input_data()
英文:
It looks like you are wanting to substitute test data for the actual data that the real class Transaction:
collects in its import_input_data_x()
methods.
Its looks like you've prepared this data in import_test_input_data()
in your test class.
You should use this data:
def test_merge_input_data(self) -> None:
self.import_test_input_data():
collection.input_1 = self.input_1
collection.input_2 = self.input_2
collection.input_3 = self.input_3
collection.merge_input_data()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论