如何为函数参数'* argv'添加解析器参数

问题描述 投票:0回答:1

我正在尝试在命令行上运行以下代码。我需要在我的Splitter函数中为* argv参数添加一个参数解析器。当我尝试如下运行代码时,出现错误:TypeError:splitter()得到了意外的关键字参数'* argv'。

我想知道是否有一种更合适的方法来添加这种类型的论点?该参数的目的是允许使用该函数的人员从* -argv的0-inf参数中添加参数,我知道它正在按我希望的方式工作。我只是不知道如何解析参数。

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))
python cmd argparse argv tabpy
1个回答
0
投票

不要将命令行参数视为函数参数[[being,而是将值[[use]用作函数参数。实际调用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文件,它应该

可能
,。使其保留为可选,但默认值为,,可以根据需要覆盖此默认值。
© www.soinside.com 2019 - 2024. All rights reserved.