在看绘制决策树代码时候看到作者这么用, 这个稍微有点违反了我的感觉, 伪代码大概如下:
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)
我觉得似乎把属性作为参数传递更符合大部分人阅读习惯?
还是我段位不够?
1
ipwx 2020-04-02 10:53:25 +08:00
这么写就是懒。本来写个类就完事了,非要搞 anti-pattern 。
三个月以后看这个程序就是臭的没法修改的。 |
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 调一天可别怪我没提醒你。 |
3
raymanr OP @ipwx
我看到的这段代码是 2010 年的了, 也不清楚是不是那时候的个别情况. 还有比如 if 判断和执行 写在同一行, 赋值变量使用 ; 在同一行多个赋值等情况 我还正在一点点的边改边写自己的版本, 不过给函数指定 attr 这种我以前真的是想都没想过, 所以上来也求证下这个合适不 |
4
julyclyde 2020-04-02 14:01:14 +08:00 1
前一年不是很流行所谓闭包么
这就是 |
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 |