类型化参数分析器
typed-argument-parser的Python项目详细描述
类型化参数分析器(tap)
tap是python的argparse库的类型化现代化。
点击提供以下好处:
- 静态类型检查
- 代码完成
- 源代码导航(例如转到定义和实现)
目录
安装
tap需要python 3.6+
要安装tap,请运行以下命令:
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
tap是python原生的
要了解这一点,让我们看一个示例:
"""main.py"""fromtapimportTapclassSimpleArgumentParser(Tap):name:str# Your namelanguage:str='Python'# Programming languagepackage:str='Tap'# Package namestars:int# Number of starsmax_stars:int=5# Maximum starsargs=SimpleArgumentParser().parse_args()print(f'My name is {args.name} and I give the {args.language} package 'f'{args.package}{args.stars}/{args.max_stars} stars!')
使用TAP的方式与使用标准argparse的方式相同。
>>> python main.py --name Jesse --stars 5
My name is Jesse and I give the Python package Tap 5/5 stars!
等效的argparse代码是:
"""main.py"""fromargparseimportArgumentParserparser=ArgumentParser()parser.add_argument('--name',type=str,required=True,help='Your name')parser.add_argument('--language',type=str,help='Programming language')parser.add_argument('--package',type=str,default='Tap',help='Package name')parser.add_argument('--stars',type=int,required=True,help='Number of stars')parser.add_argument('--max_stars',type=int,default=5,help='Maximum stars')args=parser.parse_args()print(f'My name is {args.name} and I give the {args.language} package 'f'{args.package}{args.stars}/{args.max_stars} stars!')
python本机的优点包括能够:
- 覆盖方便的内置方法(例如
process\u args
确保参数之间的一致性) - 添加自定义方法
- 从您自己的模板类继承
轻触功能
现在,我们将重点介绍一些我们最喜欢的功能,并举例说明它们在实践中的工作原理。
参数
参数被指定为在tap
的子类中定义的类变量。定义为name:type
的变量是必需的参数,而定义为name:type=value
的变量不是必需的,并且默认为提供的值。
classMyTap(Tap):required_arg:strdefault_arg:str='default value'
帮助字符串
在运行python main.py-h时,单行注释会自动解析为提供的帮助字符串。参数的类型和默认值也在帮助字符串中提供。
"""main.py"""fromtapimportTapclassMyTap(Tap):x:float# What am I?pi:float=3.14# I'm pi!args=MyTap().parse_args()
运行python main.py-h将导致以下结果:
>>> python main.py -h
usage: demo.py --x X [--pi PI] [-h]
optional arguments:
--x X (float, required) What am I?
--pi PI (float, default=3.14) I'm pi!
-h, --help show this help message and exit
灵活地添加参数
python的argparse通过add_argument
方法提供了许多高级参数解析功能。由于tap是argparse的包装,tap提供了所有相同的功能。
要使用此功能,首先像往常一样将参数定义为类变量,然后重写tap的add_arguments
并使用self.添加参数
就像使用argparse的添加参数
fromtapimportTapclassMyTap(Tap):positional_argument:strlist_of_three_things:List[str]argument_with_really_long_name:intdefadd_arguments(self):self.add_argument('positional_argument')self.add_argument('--list_of_three_things',nargs=3)self.add_argument('-arg','--argument_with_really_long_name')
类型
轻触可自动处理以下所有类型:
str,int,float,boolOptional[str],Optional[int],Optional[float]List[str],List[int],List[float]Set[str],Set[int],Set[float]
这些参数的解析如下:
str
、int
和float
:每种类型都自动解析为各自的类型,就像argparse一样。
bool
:如果参数arg
指定为arg:bool
或arg:bool=false
,则将--arg
标志添加到命令行将设置arg
为true
。如果arg
被指定为arg:bool=true
,则添加--arg
将arg
设置为false
可选
:这些参数的解析方式与str
、int
和float
完全相同
list
:如果参数arg
是list
,只需指定用空格分隔的值,就像使用常规argparse一样。例如,--arg 123
解析为arg=[1,2,3]
集合
:与列表
相同,但解析为集合而不是列表。
更复杂的类型必须用add_参数中的
type
关键字参数指定,如下例所示。
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
0
使用process\u args进行参数处理
在复杂的参数解析中,参数往往最终具有相互依赖性。这意味着可能需要禁止某些参数组合,或根据其他参数修改某些参数。
要处理这种情况,只需覆盖process_args
并添加所需的逻辑。调用parse args
时,将自动调用process args
。
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
1
正在处理已知参数
与argparse的parse_known_args
类似,tap能够只解析它知道的参数,而不会由于附加参数而引发错误。这可以通过调用parse_args
和known_only=true来实现。通过访问tap对象的
extra_args
字段,剩下的未解析参数可用。
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
2
子类化
有时定义一个模板tap,然后将其子类化以用于不同的用例是很有用的。由于tap是一个本机python类,继承是内置的,因此很容易从模板tap进行自定义。
在下面的示例中,starstap
和awardstap
从basetap
继承参数(package
和是很酷的
)和方法(处理参数
)。
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
3
打印
tap使用python的漂亮打印机以易于阅读的格式打印参数。
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
4
运行python main.py--package tap,结果是:
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
5
再现性
tap使再现性变得容易,特别是在git repo中运行代码时。
再现性信息
具体来说,tap有一个名为get_reprodubility_info
的方法,该方法返回一个字典,其中包含复制运行代码所用设置所需的所有信息。这本词典包括:
- python命令
- 用于运行程序的python命令
- 例如,
python main.py—包点击
<时间> - 运行命令的时间
- 例如:2019年8月15日星期四00:09:13
- 包含代码的git repo的根
- 例如,
/users/swansonk14/类型化参数分析器
- 指向git repo的url,特别指向当前git散列(即本地repo中head的散列)
- 例如tps://github.com/swansonk14/typed-argument-parser/tree/446cf046631d6bdf7cab6daec93bf7a02ac00998" rel="nofollow">https://github.com/swansonk14/typed-argument-parser/tree/446cf046631d6bdf7cab6daec93bf7a02ac00998
- 未提交的更改
- git repo中是否有任何未提交的更改(即代码是否与上面git hash中的代码不同)
- 例如
true
或false
保存参数
tap有一个名为save
的方法,它将所有参数以及可复制性信息保存到json文件中。
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
6
在运行python main.py--package tap
之后,文件args.json
将包含:
git clone https://github.com/kswanson-asapp/typed-argument-parser.git
cd typed-argument-parser
pip install -e .
7