我正在使用 Pydantic,有件事让我很好奇,Pydantic 引发的异常隐藏了引发异常的行。
例如使用以下代码:
from typing import Any
from pydantic import BaseModel
from pydantic.error_wrappers import ErrorWrapper, ValidationError
from pydantic.utils import ROOT_KEY
class MyModel(BaseModel):
def __init__(self, **data: Any) -> None:
exc = TypeError(f"My TypeError")
raise ValidationError([ErrorWrapper(exc, loc=ROOT_KEY)], self.__class__)
super().__init__(**data)
class Foo(MyModel):
a: int
class Bar(BaseModel):
a: int
Run Code Online (Sandbox Code Playgroud)
从我的自定义模型引发的异常将打印引发异常的行:
Foo(a=42)
# Traceback (most recent call last):
# File "D:\_exc.py", line 23, in <module>
# Foo(a=42)
# File "D:\_exc.py", line 11, in __init__
# raise ValidationError([ErrorWrapper(exc, loc=ROOT_KEY)], self.__class__)
# pydantic.error_wrappers.ValidationError: 1 validation error …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可更新的进度状态。为了做到这一点,我需要能够完全清除最后一个输出,以便我可以更新它。回车可以工作,但是当输出超过终端宽度并回绕时,将无法清除最后一个输出。所以我正在使用 tput:
n=0
while [[ $n -ne 100 ]]; do
n=$((n+1))
tput ed #clear
tput sc #save cursor
echo -n "Progress: ${n}%"
tput rc #restore cursor
sleep 1s
done
echo
Run Code Online (Sandbox Code Playgroud)
但是,如果输出足够长以致于强制终端向上滚动,这将失败。发生这种情况时,保存的光标位置不再正确,并且无法正确清除最后的输出。
例如,如果光标当前在终端的底部并且输出比终端宽度长,则会强制终端向上滚动,使之前保存的光标位置无效。
那么有没有什么办法可以保证Bash中的光标永远不会到终端结束呢?或者也许还有其他一些替代方法来防止这个问题?
编辑:我根据 F. Hauri 的回答制作了我自己的版本,简化了我的用例
#!/bin/bash
str=$(head -c 338 < /dev/zero | tr '\0' '\141')
len="${#str}"
col=$(tput cols)
lines=$(( ((len + col - 1) / col) - 1 ))
echo -ne "${str}\r"
(( len > col )) && tput cuu "$lines"
sleep 3s
tput ed
Run Code Online (Sandbox Code Playgroud) 我经常想使用我自己的个人Python项目来进行日常使用。在 golang 中,我可以运行go install project.go并将编译后的二进制文件发送到~/go/bin(位于我的 PATH 中)。现在我可以在系统中的全球任何地方运行我的程序。Python 和 Poetry 中有对应的吗?
我可能可以通过编写一个脚本来解决这个问题,该脚本运行一些东西poetry run $project并将该脚本放入我的路径之一。但我想知道的是,Python 和 Poetry 中是否有一种标准方法可以做到这一点。
pip install program我想要的是类似于我自己的项目的东西。
现在,我每次想运行程序时都需要cd进入我的项目文件夹并运行,这确实很麻烦。poetry run $project