- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我今天刚刚开始使用 PyCharm Community Edition 2016.3.2。每次我从函数 at_square
赋值时,它警告我“函数 at_square
”不返回任何内容,但在每个实例中它肯定会返回任何内容,除非在执行期间引发错误,并且该函数的每次使用都按预期运行。我想知道为什么 PyCharm 认为没有,以及我是否可以采取任何措施来纠正它。 (我知道有一个选项可以抑制该特定函数的警告,但它是通过在函数上方的代码中插入注释行来实现的,而且我发现必须记住在最后将其删除也很烦人项目。)
这是有问题的函数:
def at_square(self, square):
""" Return the value at the given square """
if type(square) == str:
file, rank = Board.tup_from_an(square)
elif type(square) == tuple:
file, rank = square
else:
raise ValueError("Expected tuple or AN str, got " + str(type(square)))
if not 0 <= file <= 7:
raise ValueError("File out of range: " + str(file))
if not 0 <= rank <= 7:
raise ValueError("Rank out of range: " + str(rank))
return self.board[file][rank]
如果重要的话,更准确地说,这是对象的方法。我坚持使用“函数”这个术语,因为这是 PyCharm 使用的语言。
我唯一的想法是,我对错误引发的使用可能会让 PyCharm 感到困惑,但这似乎太简单了。 (请随意批评我提出的错误,因为我不确定这是惯用的方法。)
更新:有趣的是,如果我完全删除返回行,警告就会消失,并在我将其放回去时立即返回。如果我替换 self.board[file][rank]
它也会消失具有像 8
这样的常量值。改变file
或rank
设置为常量值并不会消除警告,因此我认为 PyCharm 在某种程度上对 self.board
的性质感到困惑,这是其他 8 个列表的列表。
更新:根据@StephenRauch的建议,我创建了一个最小的示例,反射(reflect)了与at_square
完成的数据分配相关的所有内容。 :
class Obj:
def __init__(self):
self.nested_list = [[0],[1]]
@staticmethod
def tup_method(data):
return tuple(data)
def method(self,data):
x,y = Obj.tup_method(data)
return self.nested_list[x][y]
def other_method(self,data):
value = self.method(data)
print(value)
x = Obj()
x.other_method([1,2])
PyCharm 不会对此发出任何警告。在 at_square
,我尝试将每一行注释为以下两行:
def at_square(self, square):
file, rank = Board.tup_from_an(square)
return self.board[file][rank]
PyCharm 给出了相同的警告。如果我只留下返回线,那么警告才会消失。 PyCharm 似乎对 file
的同时分配感到困惑和rank
通过tup_from_an
。以下是该方法的代码:
@staticmethod
def tup_from_an(an):
""" Convert a square in algebraic notation into a coordinate tuple """
if an[0] in Board.a_file_dict:
file = Board.a_file_dict[an[0]]
else:
raise ValueError("Invalid an syntax (file out of range a-h): " + str(an))
if not an[1].isnumeric():
raise ValueError("Invalid an syntax (rank out of range 1-8): " + str(an))
elif int(an[1]) - 1 in Board.n_file_dict:
rank = int(an[1]) - 1
else:
raise ValueError("Invalid an syntax (rank out of range 1-8): " + str(an))
return file, rank
更新:在其构造函数中,类 Board
(这是所有这些方法的父类)将实例的引用保存在静态变量 instance
中。 。 self.at_square(square)
给出警告,而 Board.instance.at_square(square)
才不是。我仍然会在适当的情况下使用前者,但这可以阐明 PyCharm 的想法。
最佳答案
如果返回值静态计算为None
,则 PyCharm 假定缺少返回值。如果使用 None
初始化值,并稍后更改其类型,则可能会发生这种情况。
class Foo:
def __init__(self):
self.qux = [None] # infers type for Foo().qux as List[None]
def bar(self):
return self.qux[0] # infers return type as None
此时,Foo.bar
被静态推断为 (self: Foo) -> None
。 通过副作用动态更改 qux
的类型不会更新此内容:
foo = Foo()
foo.qux = [2] # *dynamic* type of foo.bar() is now ``(self: Foo) -> int``
foo_bar = foo.bar() # Function 'bar' still has same *static* type
问题在于您正在通过动态分配的实例属性覆盖静态推断的类属性。一般来说,静态分析根本无法捕捉到这一点。
您可以使用显式类型提示来修复此问题。
import typing
class Foo:
def __init__(self):
self.qux = [None] # type: typing.List[int]
def bar(self):
return self.qux[0] # infers return type as int
从Python 3.5开始,您还可以使用inline type hints 。这些对于返回类型特别有用。
import typing
class Foo:
def __init__(self):
# initial type hint to enable inference
self.qux: typing.List[int] = [None]
# explicit return type hint to override inference
def bar(self) -> int:
return self.qux[0] # infers return type as int
请注意,在有效的情况下依赖推理仍然是一个好主意!仅注释 self.qux
可以让以后更轻松地更改类型。注释 bar
对于文档和覆盖不正确的推断最有用。
如果需要支持3.5之前的版本,也可以使用 stub files 。假设您的类位于 foomodule.py 中,创建一个名为 foomodule.pyi 的文件。在里面,只需添加带注释的字段和函数签名即可;你可以(并且应该)忽略尸体。
import typing
class Foo:
# type hint for fields
qux: typing.List[int]
# explicit return type hint to override inference
def bar(self) -> int:
...
关于python-3.x - PyCharm: 'Function Doesn' t 返回任何内容',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42127461/
main.cpp #include "Primes.h" #include int main(){ std::string choose; int num1, num2; w
似乎函数 qwertyInches() 应该可以工作但是当我在 main() 中调用它时它给了我 [Error] called object 'qwertyInches' is not a funct
我无法理解 C++ 语法的工作原理。 #include using namespace std; class Accumulator{ private: int value; public:
在 类中声明 函数成员时,我们可以同时执行这两种操作; Function first; Function() second; 它们之间有什么区别? 最佳答案 Function 代表任意函数: void
“colonna”怎么可能是一个简单的字符串: $('td.' + colonna).css('background-color','#ffddaa'); 可以正确突出显示有趣单元格的背景,并且: $
我正在尝试将网页中的动态参数中继到函数中,然后函数将它们传递给函数内部的调用。比如下面这个简化的代码片段,现在这样,直接传入参数是没有问题的。但是,如何在不为每个可能的 colorbox 参数设置 s
C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。例如 std::function func = ...; do { func = func(); } while (func);
我正在将 Windows 程序集移植到 Linux。我有一些代码要移植。我实际上是 linux 中 C 的新手。我知道 C 基础知识是一样的! typedef struct sReader {
我一直在寻找一个很好的解释,所以我很清楚。示例: this.onDeleteHandler(index)}/> 对比 对比 this.nameChangedhandler(event, perso
function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto__ 得到不同的结
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 据说 Propert
VBA 中的函数没有特殊类型。我很难理解如何在 Excel VBA 中将函数作为参数添加到函数中。 我想要完成的是这样的事情: function f(g as function, x as strin
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ): 我有这个功能: date_from_text % dplyr::mutate(!!name := lubr
尝试从 std::function 派生一个类,对于初学者来说,继承构造函数。这是我的猜测: #include #include using namespace std; template cla
我正在尝试编写一个返回另一个函数的函数。我的目标是编写一个函数,它接受一个对象并返回另一个函数“search”。当我使用键调用搜索函数时,我想从第一个函数中给定的对象返回该键的值。 propertyO
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我在stackoverflow上查过很多类似的问题,比如call.call 1 , call.call 2 ,但我是新人,无法发表任何评论。我希望我能找到关于 JavaScript 解释器如何执行这些
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
作为 IaC 的一部分,A 功能应用 ,让我们将其命名为 FuncAppX 是使用 Terraform 部署的,它有一个内置函数。 我需要使用 Terraform 在函数应用程序中访问相同函数的 Ur
我是一名优秀的程序员,十分优秀!