我正在尝试使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:“代理”对象不支持索引
但是直接调用__getitem__是可行的。
发布于 2015-11-04 00:25:28
我自己也碰到过这个。
从我所看到的源代码中可以看到,Pyro4并不代理索引表示法使用的__getitem__隐式__getitem__调用。它使用代理__getattr__,这就是直接调用__getitem__方法的原因。
不过,您可以做的是(在客户端)为Pyro代理(!)创建一个代理。它实现__getitem__并让所有其他方法调用都通过:
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来说,这可能值得一次增强请求。
发布于 2015-11-13 23:35:41
虽然这也许可以添加到Pyro代理中,但它实际上促进了潜在的可怕的执行代码。索引对象通常是因为对象是某种类型的集合,而且您可能正在对其进行迭代。在Pyro代理上这样做会导致糟糕的性能,因为每个索引查找都是远程调用。简单地使用一个远程调用一次迭代整个集合,然后像往常一样迭代生成的本地对象,这通常要快得多,效率也要高得多。当然要看情况而定。
https://stackoverflow.com/questions/33388868
复制相似问题