2018 年在使用或学习 Python 过程中,“醍醐灌顶“的点有哪些?

2019-01-16 14:57:25 +08:00
 pppy

如题,欢迎讨论

4628 次点击
所在节点    Python
28 条回复
hjq98765
2019-01-16 15:00:35 +08:00
滥用 eval 会被打
zhaishunqi
2019-01-16 15:19:22 +08:00
@hjq98765 哈哈,大神,请说出你的故事...
sidegem
2019-01-16 15:54:15 +08:00
@hjq98765 怎么算滥用
xpresslink
2019-01-16 16:30:43 +08:00
我来一个吧,独家发明,是我深入理解了 python 的对象系统以后灵感一闪写出来的。

>>> add = type('add', (int,), {'__call__':lambda o,i: add(o.numerator+i)})
>>> add(1)
1
>>> add(2)
2
>>> add(1)(2)
3
>>> add(1)(2)(3)(4)
10
>>>
azuginnen
2019-01-16 16:40:18 +08:00
kwargs 好,一个调用很深的函数,上层新增一个需求,直接塞一个 kwargs,在调用链最下面取一下,做分支判断。但是这样会被项目组成员打。

如果是你个人项目,那没问题。 多用 kwargs.setdefault('', conf.xxx)
azuginnen
2019-01-16 16:41:39 +08:00
还有一个 python lookup table

lookup table
#function lookup table


def print1():
print(1)


def print2():
print(2)


def print3():
print(3)


def print4():
print(4)


ops = {
"1": print1,
"2": print2,
"3": print3,
"4": print4,
}


if __name__ == '__main__':

for key in ["1", "2", "3", "4"]:
ops[key]()
mrchi
2019-01-16 16:50:48 +08:00
@hjq98765 推荐 ast.literal_eval
hjq98765
2019-01-16 17:20:56 +08:00
@zhaishunqi
@sidegem
@mrchi
来一个我之前开脑洞写的:
a = '1,2,3,4,5,6'
b = eval('['+a+']')

做到了跟[int(x) for x in a.split(',')]一样的效果
ererrrr
2019-01-16 17:38:51 +08:00
都是一些旁门左道.
xpresslink
2019-01-16 17:42:01 +08:00
@hjq98765
写得太丑陋了
b=list(eval(a))
cominghome
2019-01-16 17:59:16 +08:00
@hjq98765 这样的代码三天后来看绝对一脸懵逼
pkoukk
2019-01-16 18:15:03 +08:00
@hjq98765
感觉自己掌握不了 py 就是因为你这样的大神太多了,为什么要有这么多种花式写法呢
每次读别人源码都是一种痛苦...
reself
2019-01-16 18:17:21 +08:00
@xpresslink 扩展一下,是不是可以写个高阶函数来做柯里化哈哈

func= curry(func)
func(1)(2)(3)
cgsv
2019-01-16 19:04:29 +08:00
@azuginnen 有必要用这个 table 吗?直接 globals()['print' + key]()
KgM4gLtF0shViDH3
2019-01-16 19:06:14 +08:00
@xpresslink #4 面试做过,当时懵逼了,现在转 go 去了😂
xpresslink
2019-01-16 19:20:50 +08:00
@cgsv 实际上那些函数名字不是相同前辍。exec('print'+key)😂
ipwx
2019-01-16 19:32:57 +08:00
https://github.com/haowen-xu/tfsnippet

上面是我的某项目,兼容 Python 2.7 & 3,TensorFlow 1.5 ~ 1.12 。为了达成这个目的,可谓花费不少心思。

比如以下摘自我项目的 requirements.txt:

----
backports.tempfile >= 1.0 ; python_version < '3.2'
filelock >= 3.0.10
frozendict >= 1.2.0
idx2numpy >= 1.2.2
lazy-object-proxy >= 1.3.1
natsort >= 5.3.3
numpy >= 1.12.1
pathlib2 >= 2.3.0 ; python_version < '3.5'
requests >= 2.18.4
scipy >= 1.2.0
semver >= 2.7.9
six >= 1.11.0
tqdm >= 4.23.0
----

比如我为了在 Travis CI 上测试兼容性做的 Docker 镜像:

https://github.com/haowen-xu/travis-tensorflow-docker

而且做到了 99% 测试覆盖率。
----

等等等等细节,就不一一论述了。我的项目,完全没有四楼等各位那么炫技,但是非常朴实。

我认为这才是 Python 的真谛。
ibreaker
2019-01-16 19:58:28 +08:00
@hjq98765 不敢用 eval
azuginnen
2019-01-16 21:21:46 +08:00
@cgsv #14
@xpresslink #16 是啊! 囧~
penghong
2019-01-16 21:49:54 +08:00
在团队协作中,可读性永远是最重要的,少用一些花里胡哨的东西。

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

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

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

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

© 2021 V2EX