Please enable Javascript to view the contents

开发 Tips(7)

 ·  ☕ 2 分钟

主要记录最近遇到的一些开发问题,解决方法。

1. Python2 和 Python3 中的异常处理

Python2,Python3 都支持的两种方式:

  • 带参数
1
2
except ExceptionType as Argument:
    # 访问 Argument
  • 不带参数
1
except ExceptionType

仅 Python2 支持的方式:

1
2
except ExceptionType, Argument:
    # 访问 Argument

2. Django 中的 get_object_or_404 和 get_queryset

get_object_or_404 通过使用 get 获取对象,否则返回 404

1
2
3
4
5
6
7
8
9
from django.shortcuts import get_object_or_404
from django.forms.models import model_to_dict
from django.http import JsonResponse
from .models import Fruit


def filter404(request):
    obj = get_object_or_404(Fruit, title='aa')
    return JsonResponse(model_to_dict(obj))

使用 get_queryset 可以全局的定制查询行为,包括 admin

1
2
3
class FruitManager(models.Manager):
    def get_queryset(self):
        return super(FruitManager, self).get_queryset().filter(is_delete=False)

3. 树形结构存储

  • 物化路径

每个节点存储其完整路径编码。

1
2
3
4
5
Name        Path
William     1
Jones       1/1
Blake       1/2
Adams       1/2/1

优点是读取和写入都非常快。

  • 邻接表模型

邻接列表表示通过保持到某些相邻节点的链接来存储树。

1
2
3
Name        Parent     Next
William     null       Joseph
Jones       William    Blake

优点是,结构简单易懂,但是数据量很大时,基于递归的查询效率非常低。

  • 嵌套集

每个节点存储一些索引(通常是左右值)。

1
2
3
4
Name        left   right
William     1      10
Jones       2      3
Blake       4      7

优点是查询数据很快,但是更新时,需要修改的节点很大。

  • 区间嵌套集

将区间映射为二维空间,每一个节点根据规则对应一个分数。在涉及节点位置的层次查询时,不需要访问数据库。优点是,性能非常好,但是实现和理解起来有一点门槛。

django-treebeard 实现了物化路径,嵌套集和邻接列表。 django-mptt 混合了嵌套集和邻接列表,能高效地查询子节点,被破坏时可以重建树。

4. Pytest 找不到模块报错

报错信息:

1
2
3
4
5
6
=================================== ERRORS ====================================
_____________ ERROR collecting home_application/test/test_mptt.py _____________
ImportError while importing test module 'C:\pytest\home_application\test\test_mptt.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
ImportError: No module named home_application.test.test_mptt

问题原因:

test 目录下,存在 __init__.py 文件,导致 Pytest 将整个 test 当作一个模块来处理。实际上,我们需要的是 Pytest 进入目录,找到 test_ 开头的文件,运行测试。只需要删除 __init__.py 文件即可。

5. CentOS 7 中 /etc/rc.local 开机不自动运行

查看 /etc/rc.local 内容发现:

1
2
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

CentOS 7 建议创建 systemd 用于开机自启动。

如果需要使用旧的方式,则需要添加到 /etc/rc.d/rc.local。同时,执行 chmod +x /etc/rc.d/rc.local,赋予可执行权限。

6. Secure shell Extension 插件 NaCI 退出,状态 255

报错原因是本地保存的指纹信息与主机信息不符。

解决办法:

在 shell 窗口,按下 Ctrl+Shift+J 进入调试窗口,在 console 执行:

1
term_.command.removeAllKnownHosts()

清空 known_hosts 即可。

7. Python 续行的几种方式

1,利用反斜杠

1
2
3
4
5
6
7
8
9
a = 'sdfaf' \
    'test'

a = '1' + '2' + '3' + \
    '4' + '5'

if False and \
    True:
    pass

2, 利用括号

1
2
3
4
5
6
7
8
9
a = ('sdfaf' 
    'test')

a = ('1' + '2' + '3' +
    '4' + '5')

if(False and 
    True):
    pass

微信公众号
作者
微信公众号