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

javascript 中到处都是回调 callback, Python 很少用到,是为什么?

  •  
  •   lisisi · 2019-02-21 23:13:46 +08:00 · 3389 次点击
    这是一个创建于 1887 天前的主题,其中的信息可能已经有所发展或是发生改变。
    14 条回复    2019-02-25 15:45:23 +08:00
    lhx2008
        1
    lhx2008  
       2019-02-21 23:19:36 +08:00 via Android
    python 完全可以写 callback,js 是不得不写 callback,本质的原因是 js 的调度模型是事件驱动的,必须把事件行为提前注册
    ysc3839
        2
    ysc3839  
       2019-02-21 23:20:27 +08:00 via Android
    JavaScript 是配合网页使用的时候回调才多吧? Python 程序的架构一般是从头执行到尾结束的。而网页中 JavaScript 不是这样,是根据事件来执行的,所以需要回调。
    1762628386
        3
    1762628386  
       2019-02-21 23:20:31 +08:00
    js 事件驱动 必须写 callback
    murmur
        4
    murmur  
       2019-02-21 23:27:52 +08:00
    python 如果是事件驱动也要 callback 的
    ipwx
        5
    ipwx  
       2019-02-21 23:43:35 +08:00
    https://www.tornadoweb.org/en/stable/iostream.html#tornado.iostream.BaseIOStream.write

    Python 当年著名的库,同样回调地狱。

    当然,Python 3.5+ 拥抱 async 了,就没有回调地狱了。
    dearxe2v
        6
    dearxe2v  
       2019-02-21 23:46:49 +08:00
    能把函数赋值给变量,都可以产生这种现象
    misaka19000
        7
    misaka19000  
       2019-02-22 00:16:05 +08:00 via Android
    因为 python 有多线程和协程可以用
    terence4444
        8
    terence4444  
       2019-02-22 00:19:24 +08:00
    不是特别了解,不过 callback 不是异步的时候才用的么?
    Python 的异步处理不是强项,所以用得少么?
    40huo
        9
    40huo  
       2019-02-22 00:56:13 +08:00 via Android
    twisted 就是回调
    so1n
        11
    so1n  
       2019-02-22 01:12:51 +08:00 via Android
    看你用啥异步类型
    icylogic
        12
    icylogic  
       2019-02-22 01:14:10 +08:00 via iPhone   ❤️ 7
    Python 当然有 callback,任何事件驱动的框架都或多或少需要。但为什么很少有”长得像 callback hell 的代码”,有一点很实际的:python 的匿名函数故意设计成不支持多行的,闭包捕获也设计成受限的形式, 所以要求你每次想传一个不方便在一行内表达的函数,就得起个名字。python 程序员或许称之为 pythonic,进一步可以参考下 GvR 为什么要这样设计。

    即使是 java 这样的语言,遇到大量复杂的事件场景,依然会出现 Handler.OnEvent(event e) 这样的设计,这种形式与提供轻量级的 callback 相比是各有优劣的。

    从语言本身来说,越是依赖于把一块有名字的内存改来改去的语言 /范式,可能越适用于前者,因为这种语言的捕获往往是 bugprone ( by ref,需要解决生命周期或者作用域) / poor perfomance ( by copy ),一般需要专门有个框架来给你处理这种事。当然有的语言和平台直接把框架做进基础库了。

    而对 closure,pure function 等概念有精良设计的语言,就可以鼓励程序员多用 callback。括号就可以叠很多层。

    还有一些觉得程序员很聪明的语言,会把这两种方式都拿出来给你用,你自己去管理到底怎么用 closure,到底用哪种方式。所以这些语言的程序员就可以把它们搅和在一起,写出彼此都看不懂的代码。

    现在我们发现大部分程序员其实没有那么聪明,只能写好同步的代码,于是现代语言纷纷加上了 async 关键字,这样你就可以用同步的方式写异步的代码了(理想)。这件事的一个积极意义在于,大家终于发现自己一直在用扭曲的方式实现本来就应该由编译器 /runtime 干的事。
    iyangyuan
        13
    iyangyuan  
       2019-02-22 10:21:26 +08:00
    人家这叫“高阶函数”
    Qzier
        14
    Qzier  
       2019-02-25 15:45:23 +08:00 via iPhone
    你如果用 python 写 gui,也是事件驱动型,一样要写回调,不过在 qt 中不这么叫,叫信号和槽。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3276 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:28 · PVG 21:28 · LAX 06:28 · JFK 09:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.