在使用pyfakefs fixture的pytest测试中,如何让pandas.read_csv()使用C引擎?
问题:使用pyfakefs fixture时,pandas read_csv强制切换到Python引擎导致float_precision参数报错
我用pandas的read_csv()读取CSV内容,需要用到high或round_trip浮点精度。下面这段代码在Python REPL或者直接运行Python程序时完全正常:
import pandas as pd from io import StringIO df = pd.read_csv(StringIO('0.00042119645,3.4,8.8244e-5\r\n'), float_precision='round_trip')
把这段逻辑放到普通pytest测试里也能正常跑,但只要引入pyfakefs fixture就会失败——不管是否显式指定engine='c',pd.read_csv()都会强制使用Python引擎,抛出如下错误:
ValueError("The 'float_precision' option is not supported with the 'python' engine")
最简复现的测试代码如下:
import pandas as pd from io import StringIO def test_pandas_read_csv( #mocker, # pytest-mock测试fixture,注释状态 fs, # pyfakefs测试fixture,启用即失败 ): try : df = pd.read_csv(StringIO('0.00042119645,3.4,8.8244e-5\r\n'), float_precision='round_trip') assert True except Exception as exc: assert False
我写了更详细的参数化测试用例,同样只要保留fs参数就会失败,注释掉fs则所有测试通过:
import pytest import pandas as pd from io import StringIO class Test_Pandas_Read_CSV : @pytest.mark.parametrize( 'csv_str,kwargs,exp_status', [ ( '0.00042119645,3.4,8.8244e-5\r\n', # csv字符串 dict( # 传入read_csv的参数 float_precision='round_trip', # engine='c', ), True, # 预期成功 ), ( '0.00042119645,3.4,8.8244e-5\r\n', # csv字符串 dict( # 传入read_csv的参数 float_precision='round_trip', engine='c', ), True, # 预期成功 ), ( '0.00042119645,3.4,8.8244e-5\r\n', # csv字符串 dict( # 传入read_csv的参数 float_precision='round_trip', engine='python', ), False, # 预期失败 ), ] ) def test_pandas_read_csv( self, # mocker, # pytest-mock测试fixture,注释状态 fs, # pyfakefs测试fixture,启用即失败 csv_str : str, kwargs, exp_status : bool, ) : try : df = pd.read_csv(StringIO(csv_str), **kwargs ) status = True except Exception as exc: status = False assert status == exp_status
请问:在必须使用pyfakefs fixture的pytest测试中,怎么让pandas的read_csv()使用默认的C引擎?
内容的提问来源于stack exchange,提问作者user19007114
相关产品推荐
相关产品推荐

