每次在函数中调用csv时,我都会在下面实例化这个对象。只是想知道无论如何我只能将对象实例化一次? 我试图将返回的csv从def csv()拆分到另一个函数但是失败了。
实例化对象的代码
def csv():
proj = Project.Project(db_name='test', json_file="/home/qingyong/workspace/Project/src/json_files/sys_setup.json")#, _id='poc_1'
csv = CSVDatasource(proj, "/home/qingyong/workspace/Project/src/json_files/data_setup.json")
return csv
测试功能
def test_df(csv,df)
..............
答案 0 :(得分:1)
您的csv
功能实际上是pytest.fixture
吗?如果是这样,您可以将其范围更改为session
,以便每py.test
个会话只调用一次。
@pytest.fixture(scope="session")
def csv():
# rest of code
当然,返回的数据应该是不可变的,因此测试不会相互影响。
答案 1 :(得分:0)
您可以使用全局变量来缓存对象:
_csv = None
def csv():
global _csv
if _csv is None:
proj = Project.Project(db_name='test', json_file="/home/qingyong/workspace/Project/src/json_files/sys_setup.json")#, _id='poc_1'
_csv = CSVDatasource(proj, "/home/qingyong/workspace/Project/src/json_files/data_setup.json")
return _csv
另一种选择是更改调用者以与上面的代码段类似的方式缓存csv()
的结果。
请注意您的"代码来调用函数"不调用该函数,它只声明另一个显然接收csv
函数返回值的函数。您没有显示实际调用该函数的调用。
答案 2 :(得分:0)
如果CSVDatasource
没有副作用,例如逐行读取输入,则可以使用装饰器。
请参阅Efficient way of having a function only execute once in a loop
答案 3 :(得分:0)
您可以将对象存储在函数的本地字典中。如果该对象存在则返回该对象,如果不存在,则创建一个新对象。
def csv():
if not hasattr(csv, 'obj'):
proj = Project.Project(db_name='test', json_file="/home/qingyong/workspace/Project/src/json_files/sys_setup.json")#, _id='poc_1'
csv.obj = CSVDatasource(proj, "/home/qingyong/workspace/Project/src/json_files/data_setup.json")
return csv.obj