为什么pycharm会警告“上面定义的未使用的重声明变量”?

8gsdolmq  于 2023-03-02  发布在  PyCharm
关注(0)|答案(3)|浏览(453)

为什么PyCharm在下面的代码中警告我关于Redeclared 'do_once' defined above without usage的问题?(警告在第3行)

for filename in glob.glob(os.path.join(path, '*.'+filetype)):
    with open(filename, "r", encoding="utf-8") as file:
        do_once = 0
        for line in file:
            if 'this_text' in line:
                if do_once == 0:
                    //do stuff
                    do_once = 1
                //some other stuff because of 'this text'
            elif 'that_text' in line and do_once == 0:
                //do stuff
                do_once = 1

因为我想让它为每个文件做一次,所以每次打开一个新文件时都有它似乎是合适的,它确实像我希望的那样工作,但因为我没有研究过Python,只是通过做和谷歌搜索学习了一些东西,我想知道为什么它给我一个警告,我应该做什么不同。
编辑:尝试使用布尔值,但仍收到警告:
为我重现警告的短代码:

import os
import glob

path = 'path'

for filename in glob.glob(os.path.join(path, '*.txt')):
    with open(filename, "r", encoding="utf-8") as ins:
        do_once = False
        for line in ins:
            if "this" in line:
                print("this")
            elif "something_else" in line and do_once == False:
                do_once = True
j1dl9f46

j1dl9f461#

为了解决一般情况:
"你可能在做的事"

v1 = []
for i in range(n):
    v1.append([randrange(10)])

v2 = []
for i in range(n):      # <<< Redeclared i without usage
    v2.append([randrange(10)])

"你能做什么"

v1 = [[randrange(10)] for _ in range(5)]   # use dummy variable "_"
v2 = [[randrange(10)] for _ in range(5)]
eivgtgni

eivgtgni2#

我猜PyCharm会被使用整数作为标志所迷惑,在您的用例中可以使用几种替代方法。
使用布尔标志而不是整数

file_processed = False
for line in file:
    if 'this' in line and not file_processed:
        # do stuff
        file_processed = True
    ...

一个更好的方法是跳转简单地停止,一旦你处理了文件中的东西,例如:

for filename in [...list...]:
    while open(filename) as f:
        for line in f:
            if 'this_text' in line:
                # Do stuff
                break  # Break out of this for loop and go to the next file
e4yzc0pl

e4yzc0pl3#

不算是答案,但也许是个解释:
很显然PyCharm试图避免类似

do_once = False
do_once = True

但是,它也标记了 * 正常 * 代码,如OP:

item_found = False
for item in items:
  if item == item_that_i_want:
    item_found = True

if item_found:
  # do something

或者类似于

last_message = ''
try:
  # do something
  if success:
    last_message = 'successfully did something'
  else:
    last_message = 'did something without success'

  # do something else
  if success:
    last_message = '2nd something was successful'
  else
    last_message = '2nd something was not successful'
  # and so on
  
  print(last_message)
  • 重新声明了上面定义的'last_message',但没有使用 * 警告将出现在每一行中,其中last_message被重新分配,但没有在中间使用它。

因此,对于发生这种情况的每种情况,解决方法都是不同的:
1.忽略警告
1.设置值后,在某处打印或记录值
1.可能创建一个函数来调用设置/检索值
1.确定是否有替代方法来实现预期结果
我的代码使用的是last_message示例,我只是删除了每种情况下重新分配last_message的代码(尽管在每次重新分配后打印也删除了警告)。我使用它进行测试以定位问题,所以它并不重要。如果我想记录完成的操作,我可能会使用一个函数来完成,而不是每次都重新分配变量。
如果我找到一种方法来关闭它或避免PyCharm中的警告,我会更新这个答案。

相关问题