[英]How to instantiate an object once
每當我在函數中調用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)
..............
您的csv
函數實際上是pytest.fixture
嗎? 如果是這樣,您可以將其作用域更改為session
以便每個py.test
會話僅調用一次。
@pytest.fixture(scope="session")
def csv():
# rest of code
當然,返回的數據應該是不變的,因此測試不會相互影響。
您可以使用全局變量來緩存對象:
_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
函數返回值的函數。 您沒有顯示實際調用該函數的調用。
如果CSVDatasource
沒有副作用(例如逐行讀取輸入),則可以為此使用裝飾器。
您可以將對象存儲在函數的本地字典中。 並返回該對象(如果存在),如果不存在則創建一個新對象。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.