Pandas似乎忽略了额外的(无效(参数。例如
import pandas as pd
df=pd.read_excel('myfile.xlsx', some_dummy_param=True)
我期望(但没有收到(类似这样的错误......
TypeError: __init__() got an unexpected keyword argument 'some_dummy_param'
问题是,由于没有错误,我认为"some_dummy_param"是有效的。这当然是意料之中的。有没有办法确保只有有效的参数传递给read_excel方法?
不,不是真的。
关键字参数在Pandas中经常通过**kwargs
传递,它要么被转发,要么被视为dict
。使用此dict
的函数可以自由检查是否有其他键,而不是它们期望的键。
您可以执行以下操作:
def safe_read_excel(self, f_name, *args, **kwargs):
# Check if kwargs contains wrong parameters
if set(kwargs.keys()).difference(set(<expected keys>)):
raise ValueError(<some messagge>)
return self.read_excel(f_name, *args, **kwargs)
pd.DataFrame.safe_read_excel = safe_read_excel
但是,这将
- 为数据帧创建非标准方法
- 可能会中断不同版本的熊猫
是的,这不是一个需要解决的小问题。pd.read_excel
在其签名中接受**kwargs
。这意味着您可以传递您喜欢的任何关键字参数,因为read_excel
不会对不需要使用的关键字参数执行任何操作。
解决此问题的一种方法是
- 确定
read_excel
实际接受哪些关键字参数 - 为
read_excel
构建参数列表 - 根据 (1( 的结果过滤掉无效参数
- 将筛选的参数列表传递给函数
若要处理 (1(,可以使用inspect
模块来确定pd.read_excel
接受哪些参数。具体而言,inspect.signature
方法返回一个Signature
对象,您可以从中查询parameters
属性。这将返回一个mappingproxy
(实际上是一个不可变的字典(。
import inspect
args = inspect.signature(pd.read_excel).parameters
print(args)
mappingproxy({'convert_float': <Parameter "convert_float=True">,
'converters': <Parameter "converters=None">,
'date_parser': <Parameter "date_parser=None">,
'dtype': <Parameter "dtype=None">,
...})
在这里,假设 (2( 已经完成。但是,在您的情况下,您需要确保潜在参数位于字典中,因为这将非常容易在映射代理和过滤器上相交。
params = {'io' : 'myfile.xlsx', 'some_dummy_param' : True}
步骤 (3( 涉及对键执行设置交集,然后仅从交集重建新的参数列表。
valid_params = {k : params[k] for k in params.keys() & args.keys()}
print(valid_params)
{'io': 'myfile.xlsx'}
这将形成有效的参数列表 — (4( 的基础。
df = pd.read_excel(**valid_params)