我正在尝试使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__
确实有效。
答案 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,这取决于当前的情况。