如何实例化一个对象一次

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