V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
raymanr
V2EX  ›  问与答

Python 中给函数指定 attribute 是良好的实践吗?

  •  
  •   raymanr · 2020-04-02 10:47:04 +08:00 · 928 次点击
    这是一个创建于 1482 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在看绘制决策树代码时候看到作者这么用, 这个稍微有点违反了我的感觉, 伪代码大概如下:

    def plot_tree(tree):
        fig_size = plot_tree.fig_size
        offset = plot_tree.offset
        plot_tree.offset = some_func(fig_size, offset)  # 这里给函数指定了 attr
        for key in tree.keys():
            if isinstance(tree[key], dict):
                plot_tree(tree[key])
            else:
                plot_node(tree[key])
                    
        
    def main():
        tree = make_tree()
        plot_tree.fig_size = size_func(tree)  # 这里给函数指定了 attr
        plot_tree.offset = offset_func(tree)  # 这里给函数指定了 attr
        plot_tree(tree)
    

    我觉得似乎把属性作为参数传递更符合大部分人阅读习惯?
    还是我段位不够?

    9 条回复    2020-04-02 14:35:20 +08:00
    ipwx
        1
    ipwx  
       2020-04-02 10:53:25 +08:00
    这么写就是懒。本来写个类就完事了,非要搞 anti-pattern 。

    三个月以后看这个程序就是臭的没法修改的。
    ipwx
        2
    ipwx  
       2020-04-02 11:01:04 +08:00   ❤️ 1
    我见过好多论文代码。

    在 python 里面用 functional pattern 的一些高阶技巧(比如 monadic combinator )也就算了,就是掉书袋子难以理解,但是不看实现细节只看接口也不是不能看代码,反正是无副作用的。

    给函数赋予 context 然后自己里面用我也不是没见过,但是一般是外面套个函数,返回里面的函数。把外部函数的参数和局部变量当闭包和内部函数裹在一起而已,我也不是没在别的编程语言见过,比如 JS 。其实也是懒,不想写类,但是没有副作用,也能用,只不过没有 IDE 的智能提示而已。反正搞学术的一般也懒得学 IDE 。(虽然正经上 IDE 还是很香的)

    比如 https://github.com/openai/glow/blob/master/model.py#L141
    - - - -

    但是懒到这种程度我也没法说什么了,这个副作用太大了。楼主你要这么做,以后出了 BUG 调一天可别怪我没提醒你。
    raymanr
        3
    raymanr  
    OP
       2020-04-02 11:07:00 +08:00
    @ipwx
    我看到的这段代码是 2010 年的了, 也不清楚是不是那时候的个别情况.

    还有比如 if 判断和执行 写在同一行, 赋值变量使用 ; 在同一行多个赋值等情况

    我还正在一点点的边改边写自己的版本, 不过给函数指定 attr 这种我以前真的是想都没想过, 所以上来也求证下这个合适不
    julyclyde
        4
    julyclyde  
       2020-04-02 14:01:14 +08:00   ❤️ 1
    前一年不是很流行所谓闭包么
    这就是
    Vegetable
        5
    Vegetable  
       2020-04-02 14:06:59 +08:00   ❤️ 1
    我觉得不是, 但是可以这么用, 只有在某些很特殊的情况下才使用这种方式.
    比如

    https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
    raymanr
        6
    raymanr  
    OP
       2020-04-02 14:11:09 +08:00
    @julyclyde
    我一直以为闭包是指的用工厂函数生产函数的做法

    不过你这么一提我倒是想起来了, js 里面好像有利用 function 封装对象的操作

    如果一个 function 本身再给他指定一些 function 作为 attr , 好像是有那么点意思了

    啊, js 真是混乱邪恶
    ipwx
        7
    ipwx  
       2020-04-02 14:24:07 +08:00
    @julyclyde 这不是闭包。你看我给的连接才叫闭包。
    julyclyde
        8
    julyclyde  
       2020-04-02 14:35:02 +08:00
    @raymanr 你这四个字真是总结的好
    julyclyde
        9
    julyclyde  
       2020-04-02 14:35:20 +08:00
    @ipwx 好的,我看看你这个链接。多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3366 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 11:50 · PVG 19:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.