- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我这辈子都无法让 MyPy 找到未与其源代码放在一起的 stub 。这是我的项目结构:
trymypy/
|- stubs/
| \- foo.pyi
|- __init__.py
|- usefoo.py
\- foo.py
# foo.py
def foofunc(x):
return str(x)
# usefoo.py
from trymypy.foo import foofunc
print(foofunc(5) + 5)
# stubs/foo.pyi
def foofunc(x: int) -> str: ...
我已将 MYPYPATH
环境变量设置为 /full/path/to/trymypy/stubs
,这样 MyPy 应该查看 stubs
我的 .pyi
文件的目录。
这不应该通过类型检查。 MyPy 应该这样标记错误:
../trymypy/usefoo.py:3: error: Unsupported operand types for + ("str" and "int")
相反,MyPy 不会标记任何错误,因为它没有读取 stub 文件。如果我将 stub 文件 foo.pyi
移动到目录的根项目,与 foo.py
并置,它会正确标记,这向我表明 MYPYPATH
没有被拾取,或者没有被正确定义。
我还尝试在配置文件 mypy.ini
中设置 mypy_path
:
[mypy]
python_version = 3.7
mypy_path = /full/path/to/trymypy/stubs
mypy.ini
中的其他配置选项确实会被提取(例如 python_version
),因此 MyPy 正在查看并读取该文件。
这里完全被难住了。这是一个(非常)简单的示例,看起来它应该像 MyPy 所记录的那样工作。我已经用尽了变量来进行试验以使其正常工作。
我正在使用 Python 3.7 并在仅安装了 mypy 的虚拟环境中工作。
最佳答案
长话短说:您可能希望将 foo.pyi
文件移动到顶级 trymypy
文件夹中,而不是单独的“stubs”目录foo.py
.
长话短说,目前您的设置存在两个问题。
第一个问题是 stub 的文件夹结构需要反射(reflect)底层代码的结构方式。所以既然你想做 from trymypy.foo import blah
,你需要调整你的文件夹结构,看起来像这样:
trymypy/
|- stubs/
| |- trymypy/
| | |- __init__.pyi
| \ \- foo.pyi
|- __init__.py
|- usefoo.py
\- foo.py
您应该继续将 mypypath 设置为指向 trymypy/stubs
。您可以使用绝对路径或相对路径。
第二个更大的问题是,您的 stub 可能最终会被隐藏和忽略,具体取决于您调用 mypy 的方式。例如,如果您从 trymypy
文件夹外部运行 mypy -p trymypy
,mypy 将首先解析每个 trymypy
及其两个子模块直接包含(trymypy.__init__
、trymypy.usefoo
和trymypy.foo
)。
并且一旦 trymypy.foo
被加载,mypy 将不会再次尝试重新加载它,这意味着它永远不会检查您指定的 stub 。
但是如果您尝试对单个文件进行类型检查(例如 mypy -m trymypy.usefoo
、mypy -p trymypy.usefoo
),mypy 将不会尝试加载所有内容在 trymypy
中,这意味着它可以使用典型的 import resolution rules 找到 stub .
您可以通过传入 -v
标志自行确认所有这些行为,该标志以详细模式运行 mypy 并准确打印出加载的内容。每次运行前一定要删除.mypy_cache
目录。
注意:老实说,我不知道这种行为差异是故意的还是 mypy 中的错误。导入规则非常微妙。
谢天谢地,修复非常简单:只需将您的 foo.pyi
文件移动到顶级 trymypy
文件夹中,如下所示:
trymypy/
|- __init__.py
|- usefoo.py
|- foo.py
\- foo.pyi
现在,无论以什么顺序导入什么,mypy 总是会同时找到 foo.py
和 foo.pyi
,因为这两个文件都位于同一个目录。每当 py
和 pyi
文件位于同一目录中时,pyi
文件总是胜出(并且忽略 py 文件)。
关于这个新的文件夹结构,您可能有两个后续问题:
有没有一种方法可以使用 foo.pyi
中的类型提示对 foo.py
的内容进行类型检查?
答案是否定的,目前没有办法。如果您有 foo.pyi
,则 foo.py
的主体基本上会被 mypy 完全忽略。有人对 adding support for this feature 感兴趣不过,您或许可以订阅链接的 Github 问题以获取更新。
创建一个单独的“ stub ”文件夹最终在这里没有用。那么什么时候有用呢?
答案是,当您要为第三方库添加 stub 时,它主要有用。实际上,我对“为您自己的代码添加 stub ”工作流没有太多经验,但我的理解是,此类 stub 通常以上述方式“内联”。
关于python - 如何正确设置 MYPYPATH 以获取 mypy 的 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437746/
我有以下 Spring 代码要使用 Spock 进行测试: @Service @RequiredArgsConstructor public class MyService { private f
package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" pb "gith
我刚开始使用Wiremock,但对 stub 有疑问。 从文档看来,您似乎可以在映射下使用JSON文件,也可以在Java代码中使用代码stubFor(get(urlEqualTo(...。但是,我发现
我有以下要测试的对象: public class MyObject { @Inject Downloader downloader; public List readFi
我看到它被使用过很多次,但从未真正停下来质疑过它。现在我想知道 stub 和 stub 之间是否有区别! 有吗?还是历史原因? stub !意思是它 stub 一次?并返回到正常的方法调用? 最佳答案
在 Jasmine 中,如何创建一个纯 stub ,其中所有方法都已 stub 并返回未定义? 最佳答案 我认为没有任何现成的东西可以做到这一点,但您可以创建自己的。 describe('Stub a
两个类。父级:B。子级:A。A.method1() 覆盖 B 的。 public class B { protected boolean method1(){...}; } public cl
我有一个函数依赖于另一个函数,而不是测试依赖性我只想测试该依赖函数的特定结果。但是,当我对函数进行 stub 时,什么也没有发生,返回结果就好像我一开始就没有对函数进行 stub 一样。 示例代码:
这是要测试的代码: const AWS = require('aws-sdk'); const { APPLICATIONS, NOTIFICATION_FREQUENCIES } = req
背景 Any client socket program(C) over TCP/IP looks like, /* Socket creation */ sockfd = socket(AF_I
我正在尝试使用 stub 提供程序(我从 this 问题的答案中得到)和 stub 验证器来实现一个简单的同步适配器。对于身份验证,我使用了基本的 sync adapter example由谷歌提供。
与在测试点使用模拟框架(如 Rhino Mocks)相比,是否存在手动创建 stub 类型更有利的情况。 我们在项目中采用了这两种方法。当我查看一长串对象的 stub 版本时,我的直觉是它会增加维护开
我想 stub doSomething 来回调错误。但是,我只希望它在第一次响应时回调并出现错误。我想在第一次调用后恢复 stub 为了 stub 第一个调用,我可以这样做: var stub = s
我有一个 TimeMachine 类,它为我提供当前日期/时间值。该类看起来像这样: public class TimeMachine { public virtual DateTime Ge
如果我有一个 Rhino Mock 对象,它已经像这样声明了一个 stub 调用: mockEmploymentService.Stub(x => x.GetEmployment(999)).Retu
通常使用 Mockito,如果你 stub 一个被多次调用的方法,你会这样做 Mockito .doReturn(0) .doReturn(1) .doReturn(2)
逻辑 public class Logic { String date = (LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyy
我想达到的目的 At the time of compilation, the compiler knew the function call was valid because you includ
这可能是一个简单的问题,但我无法缩短它。 我正在测试我的一个类,ClassToTest。在生产中,它将对第三方库对象(ThirdPartyClass 的实例)执行操作。 我想用 stub 模拟那个类。
我是 js 单元测试的新手,对使用 withArgs 进行 stub 有疑问。 我有一些名为“create”的通用外部函数,我只想为某种参数和原始“create”的其他返回值 stub 它。例如: s
我是一名优秀的程序员,十分优秀!