1、shadows name ‘xxxx’ from outer scope 警告解决

要消除这个黄色的警告,只需要一个知识点:变量隐藏 (variables shadow)

"变量隐藏"的含义就只有一句话:内部定义的变量会屏蔽父级定义的同名变量。

怎么理解呢? 打个比方,比如我村子里有一个人叫李三,镇上也有一个人叫李三。当村子里的两个人聊天的时候说 李三 咋咋咋的时候,这个李三就是村子里的,而不是镇上的。

对于 Python3 来说,这句话的意思就是:函数内定义的变量会屏蔽模块内定义的变量

在PyCharm中提示 name ‘xxxx’ from outer scope,当你在外部有个相同名称的变量在方法内部被重新指定了新的值,也就是说你在外部的相同名称的变量压根就没有任何作用。所以PyCharm就回提示这个信息。这个时候就需要我们去调整具体代码了。

2、python的变量作用域:

python中的作用域分4种情况:
L:local,局部作用域,即函数中定义的变量;
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:global,全局变量,就是模块级别定义的变量;
B:built-in,系统固定模块里面的变量,比如int、bytearray等。

搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

x = int(2.9) # int built-in

g_count = 0 # global

def outer():
    o_count = 1 # enclosing
    def inner():
    i_count = 2 # local

3、shadows name ‘xxxx’ from outer scope 出现的条件

如下所示,下面的代码出现了shadows name ‘xxxx’ from outer scope 警告:

def a():
    param = 'b'  # 这里就会出现这样的提示,因为在main定义的param对象被重新指定了新的值
    print(param)
if __name__ == '__main__':
    param = 'a'
    a()

知道了原理,我们来谈谈 shadows name 'contract_version' from outer scope 出现的条件

(1)首先应该满足变量屏蔽。也就是函数内定义了一个和函数外同名的变量

(2)函数外定义的变量,没有其它地方使用过。
如果其它地方使用了,就不会触发这个警告了。比如下面的代码,是绝对不会触发警告的

def a():
    param = 'b'  # 这里就会出现这样的提示,因为在main定义的param对象被重新指定了新的值
    print(param)
if __name__ == '__main__':
    param = 'a'
    print(param)
    a()