допустимые параметры для метода панды - PullRequest
0 голосов
/ 14 мая 2018

Панды, кажется, игнорируют дополнительные (недействительные) параметры.Например,

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 передаются только допустимые параметры?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Да, это не будет тривиальной проблемой для решения. pd.read_excel принимает **kwargs в своей подписи. Это означает, что вы можете передавать любые аргументы ключевых слов, какие пожелаете, потому что read_excel не собирается ничего делать с аргументами ключевых слов, которые не нужны для использования.

Один из способов решения этой проблемы -

  1. Определите, какие ключевые аргументы read_excel на самом деле принимает
  2. Создание списка аргументов для read_excel
  3. Отфильтровать недопустимые аргументы по результатам (1)
  4. Передать отфильтрованный список аргументов в функцию

Чтобы обработать (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) уже сделано. Однако в вашем случае вам нужно будет убедиться, что ваши потенциальные параметры находятся внутри словаря, так как это действительно будет легко пересекаться в mappingproxy и фильтре.

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)
0 голосов
/ 14 мая 2018

Нет, не совсем.

Аргументы ключевых слов часто передаются в 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

Однако это

  1. создаст нестандартный метод для DataFrame
  2. возможно сломать для разных версий Панд
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...