V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wakan190
V2EX  ›  Python

如何把 AutoProxy 类型转换成 list

  •  
  •   wakan190 · 2019-05-07 07:27:05 +08:00 via Android · 2880 次点击
    这是一个创建于 2029 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我用 manager 共享了一个 list,但在另一个 python 程序获取这个共享却发现它是 AutoProxy 类型,无法进行迭代,要怎么变成 list 呢?
    6 条回复    2019-05-10 22:49:12 +08:00
    est
        1
    est  
       2019-05-07 09:06:54 +08:00
    list(your_obj)
    wwqgtxx
        2
    wwqgtxx  
       2019-05-07 09:10:55 +08:00
    正常情况下 Manager 会对所有经过他传输的对象转化为一个 Proxy 对象,而当你需要传递一个共享的 list 的时候应该调用 manager.list()创建 list,而不是直接发送一个 list 过去。另外 python 的类型并不重要,就算它是个 AutoProxy 类型也应该可以迭代,具体的还要看你的代码才能下结论
    Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import multiprocessing
    >>> manager = multiprocessing.Manager()
    >>> l = manager.list()
    >>> l.append(1)
    >>> l.append(2)
    >>> l.append(3)
    >>> type(l)
    <class 'multiprocessing.managers.ListProxy'>
    >>> tuple(l)
    (1, 2, 3)
    wwqgtxx
        3
    wwqgtxx  
       2019-05-07 09:18:31 +08:00
    又翻了一下 multiprocessing.Manager 的源代码,确定了一下如果你获取到的是 AutoProxy 类型,那么根据它的实现,是不会代理任何_开头的方法的,自然也不会代理__iter__,所以无法迭代,你需要保证你获取到的是一个 ListProxy 对象,也就是你不能直接共享一个 list 过去,一定要用 manager.list()打包一下再共享
    wwqgtxx
        4
    wwqgtxx  
       2019-05-07 09:29:58 +08:00
    再修正一下,对于 list 只需要代理__getitem__即可,并不需要代理__iter__
    https://docs.python.org/3/library/functions.html?highlight=iter#iter
    qieqie
        5
    qieqie  
       2019-05-07 10:40:34 +08:00
    naive_list = proxy[:]
    反过来也可以 proxy[:] = naive_list
    wakan190
        6
    wakan190  
    OP
       2019-05-10 22:49:12 +08:00 via Android
    @wwqgtxx 谢谢,后来是在客户端注册时设置了一个 baseproxy 类型,然后迭代时用_getvalue()就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3137 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:51 · PVG 21:51 · LAX 05:51 · JFK 08:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.