vic*_*ooi 6 python parameters command-line-arguments argparse
我正在创建一个小的Python脚本来管理不同类别的服务器(FTP,HTTP,SSH等)
在每种类型的服务器上,我们可以执行不同类型的操作(部署,配置,检查等)
我有一个基Server类,然后是从这个继承的每种类型的服务器的单独的类:
class Server:
...
def check():
...
class HTTPServer(Server):
def check():
super(HTTPServer, self).check()
...
class FTPServer(Server):
def check():
super(FTPServer, self).check()
...
Run Code Online (Sandbox Code Playgroud)
示例命令行可能是:
my_program deploy http
Run Code Online (Sandbox Code Playgroud)
从命令行,我需要的两个必要参数是:
以前,我正在使用argparse和store操作,并使用a dict来匹配命令行选项到实际的类和函数名称.例如:
types_of_servers = {
'http': 'HTTPServer',
'ftp': 'FTPServer',
...
}
valid_operations = {
'check': 'check',
'build': 'build',
'deploy': 'deploy',
'configure': 'configure',
'verify': 'verify',
}
Run Code Online (Sandbox Code Playgroud)
(在我的实际代码中,valid_operations并不是一个天真的1:1映射.)
然后使用相当可怕的代码来创建正确类型的对象,并调用正确的类.
然后我想我会使用argparse的subparsers功能代替它.所以我做了一个subparser的每个操作(检查,构建,部署等).
通常,我可以将每个子命令链接到特定的函数,并让它调用它.不过,我不想只是调用一个通用的check()功能-我需要创建正确类型对象的第一,然后调用这个对象中的相应的功能.
有没有好的或pythonic方式来做到这一点?最好是一个不涉及大量硬编码,或者设计错误的if/else循环?
如果您设置为每个命令使用子解析器,我会做这样的事情。使用 argparse 的类型支持来调用一个函数,该函数查找要实例化的类并返回它。
然后使用 getattr() 动态调用该实例上的方法
import argparse
class Server:
def check(self):
return self.__class__.__name__
class FooServer(Server):
pass
class BarServer(Server):
pass
def get_server(server):
try:
klass = globals()[server.capitalize()+'Server']
if not issubclass(klass, Server):
raise KeyError
return klass()
except KeyError:
raise argparse.ArgumentTypeError("%s is not a valid server." % server)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command')
check = subparsers.add_parser('check')
check.add_argument('server', type=get_server)
args = parser.parse_args()
print getattr(args.server, args.command)()
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
$ python ./a.py check foo
FooServer
$ python ./a.py check bar
BarServer
$ python ./a.py check baz
usage: a.py check [-h] server
a.py check: error: argument server: baz is not a valid server.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3225 次 |
| 最近记录: |