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

2020-04-02 10:47:04 +08:00
 raymanr

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

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)

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

931 次点击
所在节点    问与答
9 条回复
ipwx
2020-04-02 10:53:25 +08:00
这么写就是懒。本来写个类就完事了,非要搞 anti-pattern 。

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

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

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

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

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

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

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

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

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

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

啊, js 真是混乱邪恶
ipwx
2020-04-02 14:24:07 +08:00
@julyclyde 这不是闭包。你看我给的连接才叫闭包。
julyclyde
2020-04-02 14:35:02 +08:00
@raymanr 你这四个字真是总结的好
julyclyde
2020-04-02 14:35:20 +08:00
@ipwx 好的,我看看你这个链接。多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX