使用Pycharm时,它经常指出错误,说:
未解决的参考'名称'。此检查检测应该的名称 解决但不要。 由于动态调度和鸭子打字,这是 可能在有限但有用的情况下。顶级和 支持类级别的项目比实例项目更好。
我已经窥探了这个问题,但我发现的大多数问题和信息都是为了防止信息显示出来。我想知道的是:
答案 0 :(得分:5)
Python使用鸭子类型约定。这意味着您不必指定名称的类型。例如,与Java不同,您必须明确指定该变量可以是int
或Object
。基本上,类型检查是在运行时完成的。
“如果它像鸭子一样走路,它像鸭子一样嘎嘎叫,那它一定是鸭子。”
在Python中,一切都会起作用,直到您尝试以不适合的方式操纵对象。基本上,一个对象可能没有另一个可能的某个方法或属性,并且在Python尝试它之前抛出错误之前你不会发现它。
Dynamic Dispatch是编译器或环境选择在运行时使用哪个版本的多态函数的做法。如果您有多个方法实现,则可以以不同方式使用它们,尽管方法具有相同或相似的属性/属性。这是一个例子:
class Foo:
def flush():
pass
class Bar:
def flush():
pass
两个类都有flush()
方法,但在运行时选择了正确的名称。
Python不是此过程的最佳示例,因为方法可以采用多个参数,而不必重新实现。 Java是一个更好的例子,但我不能流利地提供一个正确的例子。
答案 1 :(得分:1)
警告意味着您正在使用PyCharm无法识别的变量,但由于Python的动态特性,它无法确定它是否正确或者您是对的。
例如,您可能有以下代码:
class myClass():
def myfunc(self):
print(self.name)
PyCharm可能会抱怨self.name
无法解决。但是,您可以使用以下类:
my_class = myClass()
my_class.name = "Alastair"
my_class.myfunc()
这是完全有效的(虽然很脆弱)。
这个消息继续说它对不那么模棱两可的属性和方法更有信心。例如:
class myClass():
my_instance_var = "Al"
def myfunc(self):
print(self.my_instance_var)
由于my_instance_var
在源代码(类属性)中定义,PyCharm可以确信它存在。
(除非你知道自己在做什么,否则不要使用类属性。)