Как добавить аргумент парсера для аргумента функции '* argv' - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь запустить следующий код в своей командной строке. Мне нужно добавить парсер аргументов для моего аргумента * argv в моей функции Splitter. Когда я пытаюсь запустить код следующим образом, я получаю сообщение об ошибке: TypeError: splitter () получил неожиданный аргумент ключевого слова '* argv'.

Мне интересно, есть ли более правильный способ добавить такой тип аргумент? Цель аргумента - позволить людям, использующим функцию, добавлять аргументы из 0-inf для * argv, и я знаю, что он работает так, как я хочу. Я просто не знаю, как разбирать аргумент.

import pandas as pd
import numpy as np
import argparse


def arg_parse():
    parser = argparse.ArgumentParser()
    parser.add_argument("-f", "--input_file", required = True)
    parser.add_argument("-s", "--sep", required=True,)
    parser.add_argument("-t", "--target_col", required=True)
    parser.add_argument("-n", "--new_col", required = False, default = None)
    parser.add_argument("-a", "--*argv", required = False, default = None)
    args=parser.parse_args()
    return vars(args)

def splitter(input_file, target_col, sep, new_col = None, *argv):
    df = pd.read_csv(input_file)
    df[target_col] = df[target_col].str.split(sep)
    exploded = df.explode(target_col)
    exploded[target_col].replace(r'^\s*$', np.nan, regex=True, inplace = True)
    exploded.dropna(subset=[target_col], inplace=True)
    if new_col == None:
        return(pd.DataFrame(exploded[[target_col,*argv]]))
    else:
        exploded[new_col] = exploded[target_col]
        return(pd.DataFrame(exploded[[new_col,*argv]]))

if __name__ == '__main__':
    args = arg_parse()
    print(splitter(**args))

1 Ответ

0 голосов
/ 27 мая 2020

Не воспринимайте аргументы командной строки как , являющиеся аргументами функции, а скорее значения, которые вы будете использовать в качестве аргументов функции. Будьте явным при вызове splitter.

Также не используйте required=True; если требуется аргумент, он должен быть позиционным.

def arg_parse():
    parser = argparse.ArgumentParser()
    parser.add_argument("input_file")
    parser.add_argument("target_col")
    parser.add_argument("--sep", default=",")
    parser.add_argument("-n", "--new_col")
    parser.add_argument("argv", nargs="*")
    return parser.parse_args()

и

if __name__ == '__main__':
    args = arg_parse()
    result = splitter(
        args.input_file,
        args.target_col,
        args.sep,
        args.new_col,
        *args.argv
    )
    print(result)

Тогда ваша командная строка выглядит примерно так:

yourScript.py -n bar some_file.csv foo arg1 arg2
# First any optional arguments
# Then the required file name and target column
# Finally, any additional arguments for argv

Хотя вы в оригинале указано, что требуется --sep, должно быть вероятно должно быть ,, если вы действительно работаете с CSV-файлами. Оставьте его необязательным, но со значением по умолчанию ,, которое при необходимости можно изменить.

...