Python
remote debugger
你没有看错,Python Remote Debugger with PyCharm!本文是基于Python IDE:PyCharm,主要介绍 Remote Debugger 的在 PyCharm 中的配置使用,本文希望传递一个消息,远程是可在IDE调试的,也希望大家能在以后的工作中调试起来…。
Debug Configurations
先上图:
- 1: 这是一个django服务的示例
- 2: 选择的是服务器(Remote)运行环境interpreter
- 3: 本地和远端path mapping
SSH
SSH最基本的通讯协议,服务器和测试服务器没有不开的吧。
Remote Interpreter
Interpreter 解释器,使用python的对虚拟环境virtualenv
应该都不陌生,我们首先需要一个和服务器一样的运行环境。
按照顺序操作到4,点击Add Remote(如下图),SSH配置完点OK。
初次连接可能弹出提醒,确认即可,然后会回到设置主界面,切记点击Apply和OK。
config mapping etc
单击向下的那个箭头,然后编辑配置,就回到了最开始那个图,配置好后用debug方式启动就可以远程调试了,吼吼
Linux
远程调试已经完了,你可以很方便的在你本地以调试方式启动服务,在本地设置断点,然后使用服务器ip访问,捕获到断点是不成问题的,修改代码,PyCharm 也有同步的功能,但我还是喜欢下面的~
sshfs
Linux,所以直接挂载测试服务器文件:$ sshfs -o idmap=user root@10.65.200.151:/opt/disk2/var/www/V6.3.1 /local/mount/point
直接将服务器目录挂载到本地,实质就一份文件。(避免和线上配置可能的冲突)
附:取消挂载的命令$ fusermount -u $point
Windows
感谢永哥
,在windows下实现了,给大家扫雷了。在用户目录下新建.ssh
文件夹和known_hosts
文件,不然远程环境会无法建立。
虽然用不了sshfs,但是可以sftp的,配置远程文件时,需要明确选下如图,虽然选后路径不变:
不选的话,远程文件可能不识别,识别后远程文件显示为绿色。
总结
本文希望能传递一个消息:远程是可调试的!希望大家以后能用起来,以后如何用好还请大家思考。最后,欢迎任何反馈。
django advanced
本文记述我在使用Django时遇到的两个问题,两次被坑的过程,也是两次进步的过程。
qs[m:n].update()
业务我就不多说了,给queryset(总数可能有十万之多)中的部分(以万记)更新某个字段(或者说分配到某个订单),由于要保证互斥,同时希望序列号连续(对应实体的东西,方便分取)所以使用select_for_update()
,当然任何使用锁的地方应该确保尽可能少锁,同时尽快释放。
问题出来了,如此多的数据,如果循环更新,锁的时间将会比较长,可是Django不支持切片后更新。办法:
1 | qs = Models.objects.filter(...).select_for_update().order_by("id") |
qs.distinct().aggregate()
相信熟悉SQL的同学对distinct一定不陌生,加上MySQL后端,就出了这个问题。由于冗余条件的存在,所以qs里面出现了重复数据,这里就不赘述了。(注:当时使用的是Django==1.5.8,django不支持distinct(field)) So:
1 | qs = Models.objects.filter(...) |
没错,就是多操作了一步。解决方法就是这么简单,可是这个重复数据并不总是有,让我头疼了好一阵子,不过还是被我给揪出来了。
总结
第二个问题环境:MySQL数据库后端 + Diango<1.6。当然如今我们都升1.7了,不过我还是记录下。
slice
“不会slice,绝不能说会python”,slice的重要性不言而喻。
Basis
- index start with 0
- support negtive index
- [included:excluded:step] eg:
[:]
,[::-1]
- work with list, tuple and string
step
1 | In [1]: e = range(6) |
- e[::-1] == e[-1:-7:-1]
- slice切片中索引可以超出实际范围
- 带有步长的切片,索引顺序和步长方向一致
- 切片总是新产生一个对象,而不是改变原有对象
总结
Just do IT
tuple change?
在python中元组tuple是不能改变的,列表和字典是可以改变的。
change
1 | In [1]: l = [1, 2] |
总结
上述,元组的项目是列表,改变了列表。元组有没有改变,自己掂量吧…
and & or
Python 的bool运算 and & or,但运算结果不是单纯的False或者True,无疑结果是对的。一句话总结:用最少的运算,保留更多的信息,保证正确的结果。
Documentation
Operation | Result | Notes |
---|---|---|
x or y | if x is false, then y, else x | 运算是短路的 |
x and y | if x is false, then x, else y | 运算是短路的 |
关于短路
print None and None[0]
没有报错,正常打印出None。(None[0]
会报TypeError
错)
bool ? x : y
运算
由于python的bool运算保留了更多信息,所以可以实现上述三目运算。
三目运算
三目运算是这样的,可是存在一个误区!bool and x or y
误区,当x为假时,永远返回y。
修正上述误区:((test and [x]) or [y])[0]
采用了x
为假时,[x]
为真(避免上述误区),然后[0]
索引求值。
还有种简洁的写法:(y, x)[bool]
其中x,y是反的,用bool
索引求值。
上面涉及了两个值,网上还有三个或更多值的,我就不多少了,也不建议去搜。ugly
!
技巧VS陷阱
我认为,这个既算不上技巧,也不能称为陷阱。
python实现三目运算还是用x if bool else y
,从看着到结果都比较顺眼。当然适当的使用and & or保留值的特性也是可以的,主要是你要明白你写的是什么。
写代码,自己要明白,还要让看的人明白。
(看的人也要知道自己看的是python)