【发布时间】:2015-10-01 14:04:10
【问题描述】:
我创建了特殊的元类,因此我可以使用第一个“动作”参数(没有破折号)为程序/命令提供很好的包装器。特别是 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/')
可以做得更好吗?还是您认为这是滥用元类?告诉我。
【问题讨论】:
-
为什么要使用元类?请注意,如果这是您认为可以改进的工作代码,那么Code Review 可能会更好。
标签: python command subprocess wrapper metaclass