如何实例化一个对象一次
How to instantiate an object once
每次在我的函数中调用 csv 时,我都会在下面实例化这个对象。只是想知道我是否可以只实例化该对象一次?
我试图将 return 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)
.......
您可以使用全局变量来缓存对象:
_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()
的结果。
请注意,您的 "code to call the function" 并未调用该函数,它仅声明了另一个显然接收 csv
函数的 return 值的函数。您没有显示实际调用该函数的调用。
如果 CSVDatasource
没有像逐行读取输入这样的副作用,您可以为此使用装饰器。
见Efficient way of having a function only execute once in a loop
你的 csv
函数实际上是 pytest.fixture
吗?如果是这样,您可以将其范围更改为 session
,以便每个 py.test
会话仅调用一次。
@pytest.fixture(scope="session")
def csv():
# rest of code
当然,返回的数据应该是不可变的,这样测试就不会相互影响。
您可以将对象存储在函数的本地字典中。 return 如果该对象存在,则创建一个新对象。
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
每次在我的函数中调用 csv 时,我都会在下面实例化这个对象。只是想知道我是否可以只实例化该对象一次? 我试图将 return 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)
.......
您可以使用全局变量来缓存对象:
_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()
的结果。
请注意,您的 "code to call the function" 并未调用该函数,它仅声明了另一个显然接收 csv
函数的 return 值的函数。您没有显示实际调用该函数的调用。
如果 CSVDatasource
没有像逐行读取输入这样的副作用,您可以为此使用装饰器。
见Efficient way of having a function only execute once in a loop
你的 csv
函数实际上是 pytest.fixture
吗?如果是这样,您可以将其范围更改为 session
,以便每个 py.test
会话仅调用一次。
@pytest.fixture(scope="session")
def csv():
# rest of code
当然,返回的数据应该是不可变的,这样测试就不会相互影响。
您可以将对象存储在函数的本地字典中。 return 如果该对象存在,则创建一个新对象。
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