1
agnewee 2017-12-28 19:02:37 +08:00
支持
|
2
Kylin30 2017-12-28 22:18:47 +08:00
先 star 为敬
|
5
mingyun 2017-12-28 23:22:51 +08:00
不支持 win 7
$ pip install pydu Collecting pydu Using cached pydu-0.3.0.tar.gz Complete output from command python setup.py egg_info: Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Users\ADMINI~1\AppData\Local\Temp\pip-build-4i3oi1nh\pydu\setup.p y", line 41, in <module> long_description=open('README.rst').read(), UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 1162: ill egal multibyte sequence ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in C:\Users\ADMINI~1 \AppData\Local\Temp\pip-build-4i3oi1nh\pydu\ |
6
TuringGunner 2017-12-28 23:39:18 +08:00
支持一波,其实我觉得可以抛弃 python2 了
|
7
haiyangcn 2017-12-28 23:41:33 +08:00
stared
|
9
Prodesire OP @TuringGunner 主要是由于工作项目原因,还必须得支持 Python 2。 (逃
|
11
lxml 2017-12-29 00:45:44 +08:00
建议使用 Gitbook 维护,readthedocs.io 阅读体验略逊
|
12
diggerdu 2017-12-29 03:03:27 +08:00 via iPhone
pythonds
|
13
264768502 2017-12-29 08:17:59 +08:00 via Android
加个 Ordered Default Dict?
https://stackoverflow.com/questions/6190331/can-i-do-an-ordered-default-dict-in-python |
14
est 2017-12-29 09:11:37 +08:00
https://github.com/Prodesire/pydu/blob/master/pydu/list.py
这个在 py3 里貌似就一句话 >>> list(dict.fromkeys('3938475638391')) ['3', '9', '8', '4', '7', '5', '6', '1'] |
15
DeTamble 2017-12-29 09:14:47 +08:00
Win 10, Python 3.6.3 安装失败。
pip install 错误信息和上面那位一样。 用本地文件安装同样失败: [py36] PS E:\Download\pydu-master> python setup.py install Traceback (most recent call last): File "setup.py", line 41, in <module> long_description=open('README.rst').read(), UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 1162: illegal multibyte sequence 另外文档这里有三个 ipv6 写成 ipv4 了: https://pydu.readthedocs.io/zh/latest/network.html#pydu.network.is_ipv6 |
16
xpresslink 2017-12-29 09:19:08 +08:00
@est
如果要保证元素出现次序稳定,应该用 >>> from collections import OrderedDict >>> OrderedDict.fromkeys('3938475638391').keys() |
17
heaton_nobu 2017-12-29 09:48:19 +08:00
Network 里的 is_ipv6 部分没有改过来
|
18
swulling 2017-12-29 09:48:21 +08:00 via iPhone
基础库,尤其是数据结构,基础算法之类
没有一定的本事就别乱造轮子了…… |
19
est 2017-12-29 10:06:49 +08:00
@xpresslink python 3.6 以后的 dict 不会改变插入顺序了。
python2 的结果: >>> list(dict.fromkeys('3938475638391')) ['1', '3', '5', '4', '7', '6', '9', '8'] |
20
est 2017-12-29 10:10:52 +08:00 1
@xpresslink .keys() 返回也不是 list 了。而是一个可以迭代的 view
https://www.python.org/dev/peps/pep-3106/ 所以最后还是得 list() 一下。 |
21
xpresslink 2017-12-29 10:55:17 +08:00
支持一下,我用 smallcrocodile 提交了一个更新是关于 uniq list 的。
在概浏览了一下,总体上来说代码质量没有到能实用的程度。 比如 AttrDict def __getattr__(self, key): try: return self[key] except KeyError as k: raise AttributeError(k) 这个异常处理明显有问题会抛出异常两次。 return self[key] 如果 key 不存在直接就会抛异常了,后面又人工抛一次,体验不太好。 还不如下面的方案, value = self.get(key, KeyError(k)) if isinstance(value, KeyError): raise AttributeError(k) 应该有更好的方案我只是举例说一下。 另外就是是不是考虑多层字典 AttrDict 嵌套的方案。 d = AttrDict(abc={'a': 1}, d=True) d.abc.a 怎么样? if isinstance(value, dict): value = AttrDict(value) return value |
22
xpresslink 2017-12-29 11:16:48 +08:00
@est 在 python2 里返回就是 list,python3 改成的 iterator
实际上造轮子是很难的,要解决众多版本特性差异问题。 官方说了不要把 3.6 的字典有序当成可以确保的事儿。 docs.python.org/3.6/whatsnew/3.6.html#new-dict-implementation > The order-preserving aspect of this new implementation is considered an implementation detail and should not be relied upon (this may change in the future, but it is desired to have this new dict implementation in the language for a few releases before changing the language spec to mandate order-preserving semantics for all current and future Python implementations; this also helps preserve backwards-compatibility with older versions of the language where random iteration order is still in effect, e.g. Python 3.5). 另外就是在 key 出现哈希碰撞和字典发生扩容后 key 顺序是会改变的。 |
23
wueizzz 2017-12-29 11:19:41 +08:00
先 star 为敬
|
24
est 2017-12-29 11:51:46 +08:00
@xpresslink 官方的意思是,现在不能确保,因为将来才会变成强制标准。
但是 Raymond Hettinger 这种核心人物搞的东西,一般不会有人去动。 哈希碰撞和扩容发生顺序改变我倒是很感兴趣,有 case 么? |
25
est 2017-12-29 11:52:52 +08:00 1
实际上我就是从 https://twitter.com/raymondh/status/944125570534621185 这里偷学到的技巧。python core developer 都这样说了。我觉得应该没啥坑吧。
|
26
mailto1587 2017-12-29 11:58:18 +08:00
公司项目也在用 py2,支持
|
28
Prodesire OP @diggerdu 关注点不太相同,pythonds 关注的是算法上的数据结构。pydu 关注的是实际业务领域(运维、web 等)方面的数据结构和工具集。
|
32
Prodesire OP @xpresslink 这个方案是可行的,接下来我做个 benchmark,看现有的和这个方案哪个更快,占用更低
|
35
Prodesire OP @xpresslink 这个是 AttriDict,概念上如果取值错误,应该抛出属性异常,所以才把 KeyError 改成 AttributeError
|
36
Arnie97 2017-12-29 13:49:21 +08:00 via Android
粗略看了下,不少功能在 py3 标准库里有实现😂
pydu.cmd.terminate→os.kill pydu.console.console_size→shutil.get_terminal_size pydu.exception.ignore→contextlib.suppress pydu.misc.copy→shutil.copytree pydu.network.dotted_netmask→ipaddress 当然 py2 用户不妨用楼主的实现,并且像 AttrDict 这种 JS 画风的语法糖官方肯定不会写的 |
37
Prodesire OP @xpresslink 这点赞同!
|
38
Prodesire OP |
39
Prodesire OP @est 3.6 中倒没有反例。如 @xpresslink 所说,官方并不推荐这么做。
有一点你可能没有注意到,pydu 中的 uniq 还有一个参数是 key,举个例子: class A(object): def __init__(self, v): self.v = v def __repr__(self): return 'A({})'.format(self.v) l = [A(2), A(1), A(2)] uniq(l, key=lambda o: o.v) # 结果是 [A(2), A(1)] list(dict.fromkeys(l)) # 结果是 [A(2), A(1), A(2)],原因大家都知道,列表中都是不同对象,我们需要对比的是 v,但是没办法做到 |
40
Prodesire OP @Arnie97 感谢斧正!
pydu.cmd.terminate→os.kill #terminiate 在 windows 上的处理调用了 Win32API,会更加靠谱 pydu.console.console_size→shutil.get_terminal_size #这个还真是 pydu.exception.ignore→contextlib.suppress #这个还真是,Py2 上倒是可以参考实现了 pydu.misc.copy→shutil.copytree #pydu 的 copy 更加上层,不用区分拷贝对象是文件还是文件夹,类似 Linux 上的 cp pydu.network.dotted_netmask→ipaddress # 确实是这样,Python3 新增的 ipaddress 解决了相关问题,dotted_netmask 算是 py2 上的补充吧。这段代码更大的意义是学习背后的实现,来自 requests 库。 |
41
xpresslink 2017-12-31 15:02:41 +08:00
@Prodesire
你那个算法上有个歧义的地方,set([1, 2, 1.0]) -> set([1,2]) 用 dict.fromkeys 有相同的问题,因为 dict 的 key 都是调用的 objcet.__hash__()生成的,以前 python 就没有 set,都是用 dict 模拟。 |
42
qsnow6 2018-01-02 10:59:32 +08:00
可以的,作为脚手架的补充
|
43
Prodesire OP @xpresslink 我觉得类似 1 和 1.0 我们通常可以认为是一样的,那么不论是 set 还是 dic.fromkeys 的结果都可以接受。
如果说非要区分的话,倒是可以对 int, float, decimal.Decimal 做特殊处理。 |