【发布时间】:2017-02-09 02:58:19
【问题描述】:
我今天刚开始使用 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,但这似乎太简单了。 (请随时批评我提出的错误,因为我不确定这是不是惯用的做法。)
更新:幽默地说,如果我完全删除返回线,警告会消失并在我把它放回去时立即返回。如果我用像8 这样的常量值替换self.board[file][rank],它也会消失。将file 或rank 更改为常量值并不会消除警告,因此我认为PyCharm 对self.board 的性质感到困惑,self.board 是其他 8 个列表的列表。
更新:根据@StephenRauch 的建议,我创建了一个最小示例,它反映了与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 的想法。
【问题讨论】:
-
这对我来说很好用。也许你编辑太多了?您是否创建了 Minimal, Complete, and Verifiable 示例?旁注,我建议您在将任何时间花在您不理解的警告上之前清除所有警告。例如:你使用
file作为变量名,PyCharm 会抱怨。 -
@StephenRauch 这很有趣。我在切换之前在 IDLE 中编写了该函数,并且警告立即显而易见。自从使用 PyCharm 以来,我对其所做的所有更改都将其名称从混合大小写更改为带有下划线的小写。我一直在处理这些警告,但它没有说明我使用
file作为变量名。那是象棋术语中的文件。感谢您对 Minimal、Complete 和 Verifiable 示例的参考。每次我发帖时,我都会了解更多关于 SO 的信息。我不确定如何重新创建它,但我会尝试一下。 -
@StephenRauch 更新了原来的问题
-
FWIW 我在 min 函数中遇到了这个错误。我实际上是在向 min 传递一个参数,该参数(静态)被标识为 None。
-
self.board的初始值是多少?
标签: python-3.x pycharm