这是一段采用一个位置参数和两个可选参数的代码
#!/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帮助。
使用您定义的解析器和示例输入,
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
进行练习。混合两种东西也无助于你学习。