使pyro4代理可索引

时间:2015-10-28 10:40:55

标签: python pyro

我正在尝试使pyro4代理可索引。为了测试这一点,我从http://pythonhosted.org/Pyro4/intro.html#simple-example接受了问候示例,并对其进行了修改:

服务器:

import Pyro4

class Test(object):

    def __getitem__(self, index):
        return index

test = Test()
print test[1]
print test[100]


daemon = Pyro4.Daemon()
uri = daemon.register(test)


print("Ready. Object uri =", uri)
daemon.requestLoop()

客户:

import Pyro4

uri = input("What is the Pyro uri of the object? ").strip()

test = Pyro4.Proxy(uri)
print test.__getitem__(1)
print test.__getitem__(100)

print test[1]
print test[100]

[]表示法适用于服务器,但也不适用于客户端代理。我明白了:

  

TypeError:'Proxy'对象不支持索引

但直接致电__getitem__确实有效。

2 个答案:

答案 0 :(得分:1)

我自己就碰到了这个。

从我看到的the source code看,Pyro4并不代理索引表示法使用的Python隐式__getitem__调用。它代理__getattr__,这就是调用__getitem__方法直接起作用的原因。

但是,您可以做的是(在客户端)创建实现__getitem__的Pyro代理(!)的代理,并允许所有其他方法调用通过:

class TestProxy(object):
    def __init__(self, pyroTest):
        self.pyroTest = pyroTest

    def __getattr__(self, name):
        return getattr(self.pyroTest, name)

    def __getitem__(self, item):
        return self.pyroTest.__getitem__(item)

然后你可以在TestProxy对象上使用索引表示法,以及以普通的Pyro方式调用方法。

(免责声明:这个简单的解决方案可能无法覆盖所有种类的Pythonic边缘情况!)

这可能值得Pyro的增强请求。

答案 1 :(得分:1)

虽然这可能会被添加到Pyro代理中,但它实际上会促进潜在的可怕性能代码。 索引对象通常是完成的,因为对象是某种类型的集合,您可能正在迭代它。在Pyro代理上执行此操作将导致可怕的性能,因为每个索引查找都将是远程调用。 通常使用一个远程调用来简单地获取想要一次迭代的集合,然后像往常一样迭代生成的本地对象,这通常要快得多,而且效率更高。 YMMV,这取决于当前的情况。