如何实例化一次对象

时间:2015-06-08 09:08:25

标签: python object testing instantiation pytest

每次在函数中调用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)

..............

4 个答案:

答案 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