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
monetto
V2EX  ›  Python

Python 如何监听 List 长度

  •  
  •   monetto · 2022-08-22 11:54:40 +08:00 · 3648 次点击
    这是一个创建于 824 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,想要监听一个 List 的长度,当长度发生变化时,执行某些逻辑。 但是又不想每次改变的时候都启动一个线程(开销太大了)

    有什么办法可以实现吗?

    19 条回复    2022-08-31 20:57:31 +08:00
    RandomAccess
        1
    RandomAccess  
       2022-08-22 11:57:10 +08:00 via iPhone
    自定义 List 对象
    liuxingdeyu
        2
    liuxingdeyu  
       2022-08-22 11:57:43 +08:00
    你可以只开一个线程去循环查长度,或者开协程搞这件事
    ho121
        3
    ho121  
       2022-08-22 12:00:36 +08:00 via Android   ❤️ 15
    继承 list 对象,修改 append 、insert 等方法
    jdhao
        4
    jdhao  
       2022-08-22 12:01:34 +08:00 via Android
    google is your friend
    roundgis
        5
    roundgis  
       2022-08-22 12:03:45 +08:00 via Android
    變動以前檢查?
    westoy
        6
    westoy  
       2022-08-22 12:07:38 +08:00   ❤️ 1
    定义一个 ListProxy

    ListProxy 定义 callback, __getattr__的时候把 object 、函数和原 len 传给 ListFuncProxy

    ListFuncProxy 执行后对比 len, 出现变化回调 ListProxy 的 callback

    就是略显蛋疼
    leimao
        7
    leimao  
       2022-08-22 12:25:12 +08:00
    Derive from List
    ila
        8
    ila  
       2022-08-22 12:26:52 +08:00 via Android
    @ho121 这才是正常做法
    autumn426
        9
    autumn426  
       2022-08-22 12:37:36 +08:00 via Android
    继承 list 修改 list 的时候一起给做了
    hhhhhh123
        10
    hhhhhh123  
       2022-08-22 14:13:36 +08:00
    为啥要开一个线程去监听啊? 虽然不知道真实需求是什么, 但是监听 列表长度 然后相对应的逻辑, 这不是很简单吗? 当列表即将 增加, 删除, 这些前置动作代码中难道会不知道? 既然知道的话,这不就是追加列表的时候 就去执行
    ```
    def listen_list(status: bool):
    if status is True:
    print("列表追加后应执行的代码逻辑")
    else:
    "反之"


    def main():
    status = "列表会追加元素 还是删除元素 已知 True: add, False: del"
    listen_list(status=True)
    ```
    gaobing
        11
    gaobing  
       2022-08-22 14:20:07 +08:00
    killva4624
        12
    killva4624  
       2022-08-22 16:21:07 +08:00
    像上面说的,继承 List ;或者自定义一个类 List 对象,包一层 append 或者 pop 方法
    enrolls
        13
    enrolls  
       2022-08-22 17:20:32 +08:00
    dorothyREN
        14
    dorothyREN  
       2022-08-22 17:24:50 +08:00
    简单粗暴的办法,while True
    dorothyREN
        15
    dorothyREN  
       2022-08-22 17:25:27 +08:00
    @dorothyREN #14 或者封装一个修改 list 的方法,然后都调用这个方法修改
    SenLief
        16
    SenLief  
       2022-08-22 17:27:15 +08:00
    重写 list 对象的方法。
    yucongo
        17
    yucongo  
       2022-08-22 23:04:49 +08:00 via Android
    blinker 或其他 pubsub 包
    zxCoder
        18
    zxCoder  
       2022-08-22 23:23:42 +08:00
    代码全局替换,比如在 xxx.add(xxx) 前面添加一行记录代码
    huangzhiyia
        19
    huangzhiyia  
       2022-08-31 20:57:31 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2801 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:12 · PVG 21:12 · LAX 05:12 · JFK 08:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.