首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使pyro4代理可索引

使pyro4代理可索引
EN

Stack Overflow用户
提问于 2015-10-28 10:40:55
回答 2查看 222关注 0票数 0

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

服务器:

代码语言:javascript
复制
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()

客户端:

代码语言:javascript
复制
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__是可行的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-04 00:25:28

我自己也碰到过这个。

从我所看到的源代码中可以看到,Pyro4并不代理索引表示法使用的__getitem__隐式__getitem__调用。它使用代理__getattr__,这就是直接调用__getitem__方法的原因。

不过,您可以做的是(在客户端)为Pyro代理(!)创建一个代理。它实现__getitem__并让所有其他方法调用都通过:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-11-13 23:35:41

虽然这也许可以添加到Pyro代理中,但它实际上促进了潜在的可怕的执行代码。索引对象通常是因为对象是某种类型的集合,而且您可能正在对其进行迭代。在Pyro代理上这样做会导致糟糕的性能,因为每个索引查找都是远程调用。简单地使用一个远程调用一次迭代整个集合,然后像往常一样迭代生成的本地对象,这通常要快得多,效率也要高得多。当然要看情况而定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33388868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档