我最近开始使用 mypy,并遇到了一些奇怪的问题,我似乎一生都无法弄清楚。
我正在使用 mypy 0.950、django-stubs 1.11.0、django 4.0.5 和 python 3.10.2。
通过命令行运行 mypy 将返回以下内容:
project/suppliers/models.py:6: error: Name "Optional" is not defined
project/suppliers/models.py:6: note: Did you forget to import it from "typing"? (Suggestion: "from typing import Optional")
project/users/models.py:6: error: Name "Optional" is not defined
project/users/models.py:6: note: Did you forget to import it from "typing"? (Suggestion: "from typing import Optional")
project/products/models.py:6: error: Name "Optional" is not defined
project/products/models.py:6: note: Did you forget to import it from "typing"? (Suggestion: "from typing import Optional")(Suggestion: "from …
Run Code Online (Sandbox Code Playgroud) 在诸如
r = open(path, encoding="utf-8").read()
Run Code Online (Sandbox Code Playgroud)
(此处为实际行),
Pylint 2.14.5 提供以下建议:
submodules-dedup.py:71:32: R1732: Consider using 'with' for resource-allocating operations (consider-using-with)
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,建议将其更改为
with open(path, encoding="utf-8") as f:
r = f.read()
Run Code Online (Sandbox Code Playgroud)
但这真的更好吗?
就我个人而言,我认为它没有任何可读性,至于其他问题,由于引用计数的工作原理,文件不会同时关闭吗?
我使用 4 个常见的 Python 类型检查器测试了以下代码片段,令我惊讶的是,它们都没有抱怨:
\nfrom typing import Any\n\ndef length(s: str) -> int:\n return len(s)\n\ndef any_length(o: Any) -> int:\n return length(o)\n\nif __name__ == "__main__":\n print(any_length(1234))\n
Run Code Online (Sandbox Code Playgroud)\n很容易预测运行此代码将导致异常:
\nTypeError: object of type \'int\' has no len()\n
Run Code Online (Sandbox Code Playgroud)\n我的:
\nSuccess: no issues found in 1 source file\n
Run Code Online (Sandbox Code Playgroud)\npy类型:
\nSuccess: no errors found\n
Run Code Online (Sandbox Code Playgroud)\n皮赖特:
\n0 errors, 0 warnings, 0 informations\nCompleted in 0.435sec\n
Run Code Online (Sandbox Code Playgroud)\n柴堆:
\n\xc6\x9b No type errors found\n
Run Code Online (Sandbox Code Playgroud)\n我期望至少有一个警告说它 …
通常我用C#编程但是被迫在C++中做一些工作.与C#相比,与Visual Studio(2008)的集成似乎真的很差,但我想知道是否有任何可以改善这种情况的好工具,插件或配置.
另一篇文章指出了Visual Assist X程序,它至少可以帮助重构一些事情(尽管对我来说有点贵).但是,我的主要问题是,编译错误几乎没有给出错误的线索,我花了大部分时间来弄清楚我做错了什么.它只是感觉可能静态地检查比VS开箱即用更多的错误.为什么它不像C#那样提供蓝色下划线,这应该不会太难?!
我意识到问题的一半只是我是C++的新手,但我真的觉得让程序编译起来是不合理的.有没有这种工具或我的要求太高?
给定两个.Net类型,类型A和类型B,如何确定对类型B的所有属性调用(包括类型A的子类)?
我是哈德森的新人.我想在Hudson中执行'sourcecodeanalyzer'命令作为Post-build Actions来生成html报告.请尽可能让我知道,如果是,请告诉我Hudson执行命令的配置步骤.
您在这方面的最早回应将非常有帮助.
提前致谢.
我有一段时间,如果,ifif语句在一个文件中有多个条件...它是一个C语言...下面提到的格式是所有多个条件的标准.所以不用担心压力.只有问题是检查有多少条件,并根据我描述的输出格式列出....例如,如果我的C文件有代码...
while(
condition1 &&
condition2 ||
condition3
)
{
#statements;
}
Run Code Online (Sandbox Code Playgroud)
我想计算内部有多少条件,我的输出应该是
这样的......
while(
1 condition1 &&
2 condition2 ||
3 condition3
)
{
#statements;
}
Run Code Online (Sandbox Code Playgroud)
我写了代码,它适用于简单的...我的代码....
open(A,"e:\\a\\a.txt")or die;
@a=<A>;
close(A);
$count=1;
for($i=0;$i<scalar@a;$i++)
{
if($a[$i]=~m/while/g)
{
$line=$i;
until($a[$line]=~/\{/g)
{
if($a[$line]=~/(.*)[\&&\||]/g){print"$count $a[$line]";$count++;}
elsif($a[$line]=~/\(.*\)[\&&\||]/g){print"$count $a[$line]";$count++;}
else{print$a[$line];}
$line++;
}
}
last if($a[$line]=~/\{/g);
}
Run Code Online (Sandbox Code Playgroud)
但对于复杂的条件,如
while(
(
condition1 &&
condition2 &&
condition3
) ||
(
condition4 ||
condition5 &&
condition6
)
{
#statements;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出像
while(
(
1 condition1 &&
2 condition2 &&
condition3 …
Run Code Online (Sandbox Code Playgroud) 我等于这个方法,但Findbugs报告错误,任何想法?
@Override
public boolean equals(final Object obj) {
return obj instanceof String && this.value != null
&& this.value.equals(obj); // this.value is a String
}
Run Code Online (Sandbox Code Playgroud)
错误是:
Myclass.equals(Object)
检查操作数是否为String
我想从以JSON格式给出的AST构建控制流图(CFG).所以这个AST是在TouchDevelop中针对每个脚本自动创建的.而且由于TouchDevelop不是面向对象的编程,我还可以使用访问者模式吗?任何有用的指针将不胜感激.
Update1:我的问题是我不明白从哪里开始.从互联网上,我应该使用访问者模式来浏览AST以访问每个节点并收集信息.从那里,我可以构建一个CFG,然后进行数据流分析.但有两个问题:
1)据我所知,我需要面向对象的编程模型,使用访问者模式,(我可能是错的),这TouchDevelop不是.
2)如下所示,AST不是AST格式,正如我在互联网上找到的那样.它是JSON格式.我想我可以解析JSON将其转换为所需的AST结构,但我不太确定.
示例脚本的源代码
meta version "v2.2,nothing";
meta name "DivideByZero";
//
meta platform "current";
action main() {
(5 / 0)?post_to_wall;
}
Run Code Online (Sandbox Code Playgroud)
产生的AST(JSON格式)如下:
{
"type":"app",
"version":"v2.2,nothing",
"name":"DivideByZero",
"icon":null,
"color":null,
"comment":"",
"things":[
{
"type":"action",
"name":"main",
"isEvent":false,
"outParameters":[
],
"inParameters":[
],
"body":[
{
"type":"exprStmt",
"tokens":[
{
"type":"operator",
"data":"("
},
{
"type":"operator",
"data":"5"
},
{
"type":"operator",
"data":"/"
},
{
"type":"operator",
"data":"0"
},
{
"type":"operator",
"data":")"
},
{
"type":"propertyRef",
"data":"post to wall"
}
]
}
],
"isPrivate":false
}
]
}
Run Code Online (Sandbox Code Playgroud) procedural-programming static-analysis abstract-syntax-tree touchdevelop control-flow-graph
我在下面有一个相当简单的测试用例.我可以向构造函数发送空值而没有任何问题或错误,但是当我尝试向方法发送空值时,它会出错:( error: incompatible types: <null> cannot be converted to int
或者预期的任何类型).我不确定为什么会发生这种情况,而且我在很多地方看到过发送空值是可以接受的做法.在所有现实中我只需要空值,以便我可以将此示例泵入Soot和Spark进行静态分析,因此除了Spark-static分析中入口点的语义必要性之外,发送到方法的实际参数是无关紧要的.
public class Test {
public Test(Object var1, Object var2) {
//do irrelevant stuff here with var1 and var2
}
public void api1(int x, int y) {
// do irrelevant stuff with x and y
}
public List<String> api2(String x, int y, boolean a) {
// do irrelevant stuff with x, y, and a and return a new ArrayList<String>()
}
}
public class Main {
public static void main(String[] args) …
Run Code Online (Sandbox Code Playgroud) 信不信由你,我想static_assert
在宏扩展到指定的初始化器:
#define INIT(N) \
/* static_assert((N) < 42, "too large"), */ \
[(N)] = (N)
int array[99] = { INIT(1), INIT(2), INIT(42) };
Run Code Online (Sandbox Code Playgroud)
我想要一个错误INIT(42)
,但取消注释static_assert
是一个语法错误.AFAIK static_assert
在语法上是一种声明.我如何在这个例子中使用它?
转义字符串、模板文字和正则表达式中的非特殊字符没有任何效果
来源:https://eslint.org/docs/rules/no-useless-escape
但显然这是错误的:
这里没有什么需要“修复”的;我们都知道这是一个完全有效的字符序列。
开个玩笑,这背后的理由是什么?
如果 ESLint 也承认没有什么坏处,那为什么还要麻烦呢?如果您只查看最终结果(我知道该\
字符不会被打印出来),那么它可能是无用的,但在“代码就是数据”上下文中,这在进行语法分析时可能是有用的数据。
ESLint 对字符串中的内容进行判断,但它不会改变这段代码:(这对我来说也没什么用)
var x = 10;
var y = x + 0;
var z = y * 1;
Run Code Online (Sandbox Code Playgroud) 在最近的问题中,使用了导致数据争用的嵌套循环。go vet
只抓住了一些问题。
使用简化版本:
for _, o := range ol {
o := o // <- remove this: `go vet` does *NOT* complain
for _, d := range dl {
d := d // <- remove this: `go vet` will complain
go func() {
fmt.Printf("%03d %03d\n", o, d) // potential data-race
}()
}
}
Run Code Online (Sandbox Code Playgroud)
go vet
正确检测内部竞争条件,但不能正确检测外部竞争条件。
为什么是这样?太复杂以至于无法跟踪超过2个级别的范围?
static-analysis ×13
python ×3
java ×2
.net ×1
c ×1
c++ ×1
django ×1
django-stubs ×1
equals ×1
eslint ×1
findbugs ×1
fortify ×1
gcc ×1
go ×1
hudson ×1
javascript ×1
macros ×1
methods ×1
mypy ×1
null ×1
perl ×1
pylint ×1
reflection ×1
touchdevelop ×1
types ×1