【发布时间】:2017-07-25 23:32:11
【问题描述】:
我有一个远程 api,只接受可能被称为类似的 XML
api = xmlrpclib.ServerProxy(IP)
result = api.Execute({"Method": 'Method_name', "Params": [P1, P2],
... # technical values - authentication, etc
})
技术值不会经常更改 - 整个脚本通常会为它们使用相同的值,因此我创建了一个具有方法的类
def call(self, method_name, params):
self.api.Execute(<constructed dictionary>)
我想知道是否可以将这些方法直接调用为self.api 的方法,例如:
self.api.method_name(params)
这将依次填写.Execute 和我的其余部分,总体思路如下:
def __getattr__(self, item):
if item in self.__dict__:
return self.item
else:
return functools.partial(self.call, method_name=item)
所以,如果我在类中定义了一个方法(self.foo、self.bar 等)——调用它会产生self.foo 和self.bar 的真实结果。
像self.api.METHOD(params) 这样调用它,其中METHOD 是一个自定义的方法,但是这种方法“污染”了我没有定义的其他方法,比如self.api.__repr__ 等等
根据this question,我覆盖__getitem__ 的方法是否完全不正确?如果是这样 - 我应该如何实施?
【问题讨论】:
-
Execute是否采用单个字典或一系列关键字参数?第一个块中的代码似乎表示前者,但您调用partial的方式表示后者。此外,是否有完整的可用Execute方法的列表公开给脚本? -
@wilusdaman,它实际上需要一个字典。使用
partial的方式是因为存在间歇性的内部和外部方法来构造此字典并对其值进行操作。很遗憾,没有完整的列表。