python3 arparse 关于参数丢失的错误

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

这是一段采用一个位置参数和两个可选参数的代码

#!/usr/bin/env python3
import argparse
from typing import NamedTuple, Dict, List
import csv


class Args(NamedTuple):
    rna: str
    ins: List
    dell: int

def get_args() -> Args:
    parser = argparse.ArgumentParser(description='translating mRNA', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('rna', metavar='RNA seq', type=str)
    parser.add_argument('--ins', '-i', type=list, help='add the insertion position and the base to test its frameshift effect')
    parser.add_argument('--dell', '-d', type=int, help='add the position of the deleted base to test its frameshift effect')
    args = parser.parse_args()

    if args.rna and not args.ins and not args.dell:
        return Args(args.rna)
    elif args.rna and args.ins:
        return Args(args.rna, ins=args.ins)
    elif args.rna and args.dell:
        return Args(args.rna, dell=args.dell)
    else:
        raise TypeError('Invalid arguments provided')


def main():
    args = get_args()
    codons = codon_dict()
    rna = args.rna
    ins = args.ins
    dell = args.dell
    protein = translator(rna)
    print(f'protein_original:\n{protein}')
    if args.ins and not args.dell:
        ins_mut_rna = list(rna)
        ins_mut_rna.insert(ins[0] + 1, ins[1])
        ins_mut_protein = translator(ins_mut_rna)
        print(f'frameshift protein\n{ins_mut_protein}')
    elif args.dell and not args.ins:
        dell_mut_rna = list(rna)
        dell_mut_rna.pop(dell + 1)
        dell_mut_protein = translator(dell_mut_rna)
        print(f'frameshift\n{dell_mut_protein}')
    elif args.ins and args.dell:
        if args.ins[0] > args.dell:
            ins_dell_rna = list(rna)
            ins_dell_rna.insert(ins[0] + 1, ins[1])
            ins_dell_rna.pop(dell + 1)
            ins_dell_prot = translator(ins_dell_rna)
        elif args.dell > args.ins:
            dell_ins_rna = list(rna)
            dell_ins_rna.pop(dell + 1)
            dell_ins_rna.insert(ins[0] + 1, ins[1])
            dell_ins_prot = translator(dell_ins_rna)
            print(f'frameshift protein\n{dell_ins_prot}')


def translator(rna) ->str:
    prot = []
    steps = [i for i in range(0, len(rna), 3)]
    rna_codons = []
    for step in steps:
        rna_codons.append(rna[step:step + 3])
    start = rna_codons.index('AUG')
    rna_codons = rna_codons[int(start):]
    for codon in rna_codons:
        if codon in codons:
            if codons[codon] == 'Stop':
                break
            prot.append(codons[codon])
    return ''.join(prot)


def codon_dict() ->Dict:
    mydict = {}
    with open('codon_table.csv', mode='r') as infile:
        reader = csv.reader(infile)
        for rows in reader:
            k = rows[0]
            v = rows[2]
            mydict[k] = v
        return mydict


if __name__ == '__main__':
    main()

当我尝试在终端上传递此命令时,我得到的是 命令:

python3 prot.py AUGUUUAUG -d 4 -i '4 T'

错误:

line 22, in get_args
    return Args(args.rna, ins=args.ins)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: Args.__new__() missing 1 required positional argument: 'del

我尝试修改get_args()中的if、elif,但是没有用,也google了错误但是没有找到解决方案,问了chat-gpt,但是它的解决方案也没有用,pls帮助。

arguments parameter-passing argparse
1个回答
0
投票

使用您定义的解析器和示例输入,

args
命名空间为:

In [13]: import shlex
In [14]: alist = shlex.split("AUGUUUAUG -d 4 -i '4 T'"); alist
Out[14]: ['AUGUUUAUG', '-d', '4', '-i', '4 T']

In [15]: args = parser.parse_args(alist)
In [16]: args
Out[16]: Namespace(rna='AUGUUUAUG', ins=['4', ' ', 'T'], dell=4)

请注意,

-i
字符串“4 T”已被拆分为单个字符的列表。这就是
list('4 T')
的作用。您可能不想要那个
type
功能。

但是错误是

TypeError
,由线

产生
Args(args.rna, ins=args.ins)

它是说

Args
缺少位置参数
dell
。这不是
argparse
错误,它将显示用法并退出。

你想在这里做什么?学习

argpare
typing
还是其他?

这不是其他人会犯的错误,因此疯狂的互联网或人工智能搜索不太可能有帮助。您需要阅读更多有关

typing
的内容。我还建议在没有
argparse
层的情况下使用
typing
进行练习。混合两种东西也无助于你学习。

© www.soinside.com 2019 - 2024. All rights reserved.