我创建了特殊的元类,这样我就可以为带有第一个“action”参数(没有破折号)的程序/命令提供很好的包装。特别是 svn、git 等。我不想为此目的使用外部工具。
import subprocess
class CmdWrap(type):
def __new__(mcs, name, bases=(object,), dict={}):
dict['name'] = name
return type.__new__(mcs, name, bases, dict)
def __getattr__(self, name):
def run_cmd(*args, **kwds):
cmd = (self.name, name) + args
process = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
cwd=None)
out = process.communicate()
if process.returncode != 0:
raise Exception(cmd, process.returncode, out)
else:
return out
if name in self.__dict__:
return self.__dict__['name']
else:
return run_cmd
你觉得怎么样?更喜欢像这样运行你最喜欢的命令:
svn = CmdWrap('svn')
svn.ls('http://your_repository/')
可以做得更好吗?或者您认为这是元类的滥用?告诉我。