python类中方法返回自身值类型的写法

在python3中使用类型遇到的问题,代码如下:

想在factory创建自已,以为类型是这样的-> People

1
2
3
4
5
6
7
8
9
class People:
name: str

def __init__(self, name: str) -> None:
self.name = name

@classmethod
def factory(cls, name: str) -> People:
return cls(name)

这样的错的

正确的写法是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
from typing import TypeVar, Type

T = TypeVar('T', bound='People')

class People:
name: str

def __init__(self, name: str) -> None:
self.name = name

@classmethod
def factory(cls: Type[T], name: str) -> T:
return cls(name)

要写成泛型才对,问题地址:https://github.com/python/peps/pull/89

另一种方法

类型写成字符串也是可以的

1
2
3
4
5
6
7
8
9
class People:
name: str

def __init__(self, name: str) -> None:
self.name = name

@classmethod
def factory(cls, name: str) -> "People":
return cls(name)

pip安装模块出现neither-setup.py-nor-pyproject.toml-found

使用pip安装模块时出现neither 'setup.py' nor 'pyproject.toml' found.导致模块无法安装

因为根据打包方案,项目中需要一个setup.py或pyproject.toml用于生成包的配置文件,然而模块里没有按照这个规定来

网上搜了一遍,没找到解决方案

只能选择手动安装

https://pypi.org/,找到相应的包,下载下来解压到python的Lib目录

windows下缺失fcntl报错

windows下运行python项目,报错ModuleNotFoundError: No module named 'fcntl'

fcntl库是linix的Python发行版才有,windows没有带

方法一

pip安装缺失的包,这个地址去搜索https://libraries.io/search?q=micropython

1
pip install micropython-xxx

仓库地址:https://github.com/micropython/micropython

方法二

在python库文件目录D:\Python\Python38\Lib\site-packages中创建’fcnty文件,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def fcntl(fd, op, arg=0):
return 0

def ioctl(fd, op, arg=0, mutable_flag=True):
if mutable_flag:
return 0
else:
return ""

def flock(fd, op):
return

def lockf(fd, operation, length=0, start=0, whence=0):
return

centos7编译安装python3

安装编译依赖

1
yum install zlib zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

找到要安装的对应版本https://www.python.org/downloads/source/

下载

1
wget https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tar.xz

解压

1
tar -xvf Python-3.9.10.tar.xz

编译

1
2
3
4
5
6
# 进入解压后的目录
cd Python-3.9.10
# 配置安装目录/usr/local/python3
./configure prefix=/usr/local/python3
# 编译
make && make install

成功之后会生成/usr/local/python3目录

可能的问题:

  • gcc版本太低,需要重新安装高版本的gcc

替换自带的python

1
2
3
4
5
6
# 原python位置
which python
# 备份
mv /bin/python /bin/python_bak
# 重新链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python

替换自带的pip

1
2
3
4
5
6
# 原pip位置
which pip
# 备份
mv /bin/pip /bin/pip_bak
# 重新链接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip