我正在创建一个小的 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()
...
示例命令行可能是:
my_program deploy http
在命令行中,我需要的两个强制参数是:
- 要执行的操作
- 要创建/管理的服务器类型
以前,我是使用argparse
andstore
操作,并使用 adict
将命令行选项与实际的类和函数名相匹配。例如:
types_of_servers = {
'http': 'HTTPServer',
'ftp': 'FTPServer',
...
}
valid_operations = {
'check': 'check',
'build': 'build',
'deploy': 'deploy',
'configure': 'configure',
'verify': 'verify',
}
(在我的实际代码中,valid_operations 并不是一个简单的 1:1 映射。)
然后使用相当糟糕的代码创建正确类型的对象,并调用正确的类。
然后我想我会使用 argparse 的subparsers
功能来代替它。因此,我将每个操作(检查、构建、部署等)都设置为subparser。
通常,我可以将每个子命令链接到一个特定的函数,并让它调用它。但是,我不想只调用通用check()
函数——我需要先创建正确类型的对象,然后在该对象中调用适当的函数。
有没有好的或pythonic的方法来做到这一点?最好是不涉及大量硬编码或设计不良的 if/else 循环?