Q-Logo 我的学习笔记分享

Entries for category "debug"

pip 安装wheel 报错xxx.whl is not a supported wheel on this platform.

pip 安装wheel 格式的包时,如果版本不对会报“xxxx.whl is not a supported wheel on this platform”的错误,以本地python 版本为python3.7,安装pycairo为例,

pip install /path/to/pycairo-1.19.1-cp39-cp39-win32.whl

pycairo-1.19.1-cp39-cp39-win32.whl is not a supported wheel on this platform.

文件名中一般会包含类似cp27 或 cp39 等字符串,表明.whl文件所支持的python 版本,需要选择与自己的python 版本对应的wheel 文件。像上面这种情况,只需下载pycairo-1.19.1-cp37-cp37m-win_amd64.whl 这个版本的wheel 文件,再安装就可以了。

另外,还可以通过如下命令查看本地Python 支持的wheel 文件

>>> import pip._internal

>>> pip._internal.pep425tags.get_supported()

vue-devtools 安装和使用

从 https://github.com/vuejs/vue-devtools/ 下载Vue DevTools master 版本。

cnpm i

cnpm run build

打开Chrome,在地址栏输入chrome://extensions/ 或 “菜单->更多工具->扩展程序”,进入扩展程序页面,然后点击右上角打开“开发者模式”,再点击“加载已解压的应用程序”,选择vue-devtools-master\shells\chrome 目录加载。

使用时,在Chrome浏览器打开开发中的Vue 页面,F12,会出现Vue 选项卡,点击左边的组件树可以在右边检查数据。

Pandas DataFrame的round函数详解及小坑

df.round(decimals=0, *args, **kwargs)

输入参数

decimals : int, dict, Series,每一列舍入到的小数位数。如果是整数,每一列都被舍入到这个位数;如果是字典或序列,各列舍入到指定的精度。列的名字应该作为decimals 字典的键,或者decimals 序列的index。未在decimals 中指定精度的列将保留原样。如果decimals 中有不是列名的键或index,会被忽略。

返回:

DataFrame: 舍入到指定精度的DataFrame。

decimals=0时,返回的是浮点数而非整数。

round 并非四舍五入,对浮点数执行round 须谨慎。

从Python 的round 函数的坑谈四舍五入

对浮点数执行 round ,返回的不是四舍五入的值,而是按以下规则确定的:

  1. 值会被舍入到距离 number 最接近的 10 的负 ndigits 次幂的倍数
  2. 如果 number 与两个倍数的距离正好相等,则选择偶数,即正好在中间时,向偶取整

我们输入和看到的浮点数,与计算机中存储和运算时使用的浮点数未必完全相同,多数时候后者只是前者的近似值。

round(2.675, 2) 返回2.67 而不是 2.68 ,并不是错误,也不是bug,而是使用计算机进行浮点运算必然会出现的现象。

除非对精确度要求比较底,否则尽量避免用round()函数处理浮点小数。

如果确实需要使用四舍五入的方式进行舍入,可以用 decimal 模块:

>>> import decimal

>>> D = decimal.Decimal

>>> decimal.getcontext().rounding = "ROUND_HALF_UP" # 设置舍入方式为四舍五入

>>> D('2.675').quantize(D('0.00'))

Decimal('2.68') # 四舍五入后的值

Vue 相同路由跳转时通过key 属性强制刷新组件

通过this.$router.push 跳转到其他路由,当要跳转到的路由和当前路由相同时(例如都是跳转前后路由都是'/postlist/',但查询参数不同的情况),会出现组件页面不刷新的问题。例如,当前页面是文章列表'/postlist/',需要跳转到某一分类的文章列表'/postlist/?categories=1',跳转代码是这样的

this.$router.push({ path: '/postlist/', query: { categories: cid } }).catch(err => err)

代码执行后,对应的组件本身并没有被刷新。这是vue的默认行为,同样的一个路由,多次push时,页面不会再次刷新和发送请求 。

最简单的办法,就是将上面变化的参数绑定到<router-view/> 中key属性。例如:

<router-view :key="$route.path + $route.query.categories"></router-view>

这样修改之后,this.$router.push时,只要query 的categories参数发生变化,对应的<router-view/> 组件就会被刷新了。