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

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

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)

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

相关文章

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

  1. 这么写就是懒。本来写个类就完事了,非要搞 anti-pattern 。

    三个月以后看这个程序就是臭的没法修改的。

  2. 我见过好多论文代码。

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

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

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

    但是懒到这种程度我也没法说什么了,这个副作用太大了。楼主你要这么做,以后出了 BUG 调一天可别怪我没提醒你。

  3. @ipwx
    我看到的这段代码是 2010 年的了, 也不清楚是不是那时候的个别情况.

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

    我还正在一点点的边改边写自己的版本, 不过给函数指定 attr 这种我以前真的是想都没想过, 所以上来也求证下这个合适不

  4. @julyclyde
    我一直以为闭包是指的用工厂函数生产函数的做法

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

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

    啊, js 真是混乱邪恶

发表评论

电子邮件地址不会被公开。 必填项已用*标注