小编Uba*_*eri的帖子

mypy 和 pyproject.toml,选项仅在全局范围内有效

我希望仅对某些特定模块使用这些选项disable_error_code = ["name-defined"]ignore_missing_imports = true但我正在努力使其工作。以下是我的非工作pyproject.toml文件的摘录:

[tool.mypy]
python_version = "3.9"
disallow_untyped_defs = true
show_error_codes = true
no_implicit_optional = true
warn_return_any = true
warn_unused_ignores = true
exclude = ["scripts", "docs", "test"]


[[tool.mypy.overrides]]
module = [
    "firstmodule",
    "secondmodule",
    "utils",
    "config",
]
disable_error_code = ["name-defined"]
ignore_missing_imports = true
Run Code Online (Sandbox Code Playgroud)

更具体地说,如果我disable_error_code = ["name-defined"]按照上面的指示进行操作,那么我会收到以下错误:

pyproject.toml:[module =“utils”]:每个模块部分应该只指定每个模块标志(disable_error_code)

如果我ignore_missing_imports = true按照上面的指示保留,那么它会被忽略,并且会发出由于缺少导入而导致的错误。

相反,如果我将上述两个选项移至[tool.mypy]一切正常下方。

mypy pyproject.toml

23
推荐指数
2
解决办法
1万
查看次数

从命令行中使用 pytest 排除多个标记的测试

我的中有以下内容pyproject.toml

[tool.pytest.ini_options]

markers = [
    "plot: marks SLOW plot tests (deselect with '-m \"not plot\"')",
    "open_tutorial: marks the open_tutorial (which opens VSCode all the times)"
]
Run Code Online (Sandbox Code Playgroud)

我有一堆相应标记的测试方法。

如果我跑

coverage run --branch -m pytest -m "not open_tutorial"
Run Code Online (Sandbox Code Playgroud)

或者

coverage run --branch -m pytest -m "not plot"
Run Code Online (Sandbox Code Playgroud)

我得到了想要的结果,即跳过了标记的测试,但我不知道如何pytest跳过这两个测试。我尝试了以下方法

coverage run --branch -m pytest -m "not open_tutorial" -m "not plot"
coverage run --branch -m pytest -m "not open_tutorial" "not plot"
coverage run --branch -m pytest -m ["not open_tutorial","not plot"]
Run Code Online (Sandbox Code Playgroud)

但它们都不起作用。

python pytest

9
推荐指数
1
解决办法
3485
查看次数

更改变量类型时如何编写类型提示?

说我有

def foo(x: Union[str, list[str]], y: Union[str, list[str]]) -> tuple[list[str], list[str]]:
     
    x = cast(Union[list[str], tuple[list[str], ...]], str2list(x))  
    y = cast(Union[list[str], tuple[list[str], ...]], str2list(y))  
    
    return x,y
     
def str2list(*args: Union[str, list[str]]) -> Union[list[str], tuple[list[str], ...]]:
    vals = []
    for x in args:
        if not isinstance(x, list):
            x = [x]
        vals.append(x)
    if len(args) == 1:
        return vals[0]
    else:
        return tuple(vals)
    

x = 'My name is x'
y = ['First element', 'Second element']

z = str2list(x,y)
Run Code Online (Sandbox Code Playgroud)

如您所见,有两个cast调用foo,但仍然mypy抱怨

error: …
Run Code Online (Sandbox Code Playgroud)

python python-3.x mypy

8
推荐指数
0
解决办法
2816
查看次数

使用孵化时如何将包数据添加到 pyproject.toml 中?

注意这个问题涉及hatch(不是setuptools也不是distutils)。

\n

我正在开发我的第一个包,并且正在遵循指南。

\n

我的项目结构如下:

\n
mypackage\n\xe2\x94\x82   LICENSE\n\xe2\x94\x82   pyproject.toml\n\xe2\x94\x82   README.md\n\xe2\x94\x82   requiremets.txt            \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80docs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80scripts          \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80src\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80mypackage\n\xe2\x94\x82          config.py\n\xe2\x94\x82          first_module.py\n\xe2\x94\x82          datatypes.py\n\xe2\x94\x82          utils.py\n\xe2\x94\x82          first_module.py\n\xe2\x94\x82          __init__.py         \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80tests\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我注意到其中只有上面树的C:\\Users\\<User>\\Miniconda3\\envs\\myenv\\Lib\\site-packages\\mypackage内容。./mypackage/scr/mypackage

\n

我想要实现的是还安装脚本文件夹,因为在源代码中我定义了一个函数

\n
def open_tutorial() -> None:\n    site_packages = next(\n        p for p in sys.path if "site-packages" in p\n    )\n    open(site_packages+"\\\\mypackage\\\\scripts\\\\tutorial.py")\n
Run Code Online (Sandbox Code Playgroud)\n

这将允许用户运行如下代码

\n
import mypackage as mpkg\n\nmpkg.open_tutorial()\n
Run Code Online (Sandbox Code Playgroud)\n

我期望的是scripts/tutorial.py在用户编辑器中打开。

\n

如何实现我的目标?我想我应该编辑文件中的某些内容pyproject.toml,或者我必须hatch以某种方式进行设置,但我不知道如何设置。有什么建议吗?

\n

相关问题:我希望它适用于任何操作系统,因此open_tutorial()欢迎任何关于如何更改我的功能的提示!:)

\n

python python-3.x

7
推荐指数
1
解决办法
3807
查看次数

来自 pyproject.toml 的 Conda 骨架

我正在尝试构建我的第一个 conda 包,但我遇到了麻烦。我的包在 上可用pypi,我正在尝试通过发出 来遵循conda 命令conda skeleton --recursive mypackage

尽管如此,似乎为了从中创建菜谱,包pypi需要pypi有一个setup.py,这不是我的情况,因为我使用新pyproject.toml方法。

我想知道是否有一种方法可以conda skeleton直接创建一个pyproject.toml,因为其中已经包含了很多所需的信息。我应该等待Anaconda团队更新他们的建筑系统吗?

与此同时,我注意到grayskull包,但我会避免有另一个依赖项。

python anaconda conda

7
推荐指数
0
解决办法
2506
查看次数

删除名称包含怪异字符的分支

我使用Git Bash,并且错误地创建了一个名为-D的分支。在通过Google搜索之后,我尝试了

git branch -d -- -D 
Run Code Online (Sandbox Code Playgroud)

获得

error: branch '-D' not found. 
Run Code Online (Sandbox Code Playgroud)

而且我也试图从gitk中删除它,但没有成功。

另一方面,我注意到如果git branch从控制台键入或在gitk上显示分支名称,则分支名称会更改。例如,分支在控制台中为-D,但在gitk上用奇怪的字符命名。

用git log获得的分支名称

分支名称显示在gitk中

此时,我将怪异的名字从gitk复制/粘贴到控制台,然后发出

git branch -d â?"D
Run Code Online (Sandbox Code Playgroud)

没有成功。

但是,我收到警告消息:“警告:您的控制台字体可能不支持Unicode。如果在输出中遇到奇怪的字符,请考虑切换到TrueType字体,例如Lucida Console!”

作为最后一次尝试,我尝试从gitk中删除该分支,但出现一个弹出窗口,显示“错误:分支,找不到另一个奇怪且较长的名称 ”。

这次,由于无法从弹出窗口复制,因此无法从弹出框复制另一个粘贴又长又怪异的名称到控制台。

git branching-and-merging git-branch

2
推荐指数
1
解决办法
1074
查看次数

在 gitk 中扩展提交历史

我有一台装有 Git Bash 的 Windows 7 机器。我相当满意,但我希望以更好的方式查看提交历史。我试过了

log --oneline --graph --decorate --all
Run Code Online (Sandbox Code Playgroud)

但我觉得读起来有点困难。或者,我使用 gitk 以一种很好的方式显示提交历史,但是显示图表的窗口太小了。我在谷歌上搜索了一些替代品,比如 gitg 或 gitx 但它们似乎不适用于 git bash - 至少在我的理解中。

有什么方法可以扩展 gitk 窗口以显示提交图,或者您能建议我一些其他解决方案吗?如果可能,我希望坚持使用 Git Bash。

git bash

1
推荐指数
1
解决办法
326
查看次数

mypy:如何为带有 2 个位置参数但只传递 1 个就足够的函数编写类型提示?

假设我有一个函数foo,允许它接受如下参数

foo(a,b) -> It is OK
foo(None,b) -> It is OK
foo (a, None) -> It is OK
foo(None,None) -> It is NOT OK!!!
Run Code Online (Sandbox Code Playgroud)

如何编写它的签名,包括它的类型提示?

目前我已将类型提示写为

def foo(a:Optional[str], b:Optional[str]) -> str
Run Code Online (Sandbox Code Playgroud)

但这是错误的,因为这样的签名对于调用来说是没问题的foo(None,None)

python mypy

1
推荐指数
1
解决办法
493
查看次数

将元素列表转换为元组列表以匹配另一个元组列表的结构

假设我有以下列表

L = [("a0","a1"),("b0",),("b1","a1","b0"),("a0","a1"),("b0",)]
M = ["u0", "u1", "u2", "u3", "u4", "u5", "u6", "u7" , "u8"]
Run Code Online (Sandbox Code Playgroud)

我想将 的元素分组M到一个元组列表中,N使其N具有相同的结构L,即

N = [("u0", "u1"), ("u2",), ("u3", "u4", "u5"), ("u6", "u7") , ("u8",)]
Run Code Online (Sandbox Code Playgroud)

或者,更准确地说,[len(L[ii]) == len(N[ii]) for ii, t in enumerate(L)]具有所有True元素 和M == Q,其中Q = [item for t in N for item in t]

怎么做?

python

0
推荐指数
1
解决办法
63
查看次数