Python:尽管有两种相同的情况,为什么我还是收到一个警告? “外部范围的阴影名称”

问题描述 投票:0回答:1

我在 PyCharm 中有这段代码:

                device_name = ''
                current_device = ''
                if torch.cuda.is_available():
                    current_device = torch.cuda.current_device()
                    device_name = torch.cuda.get_device_name(current_device)

                file_footer += str(current_device) + ', ' + device_name +', modell: ' + used_model + ', ' + used_language

如您所见,我在 if 块之外声明了两个变量。然后我在 if 块内分配这两个变量。最后我使用了 if 块的外部。

PyCharm 对此片段给出了 one 警告

"Shadows name 'current_device' from outer scope"
,尽管
device_name
的使用方式完全符合逻辑。

首先我认为这是类型不匹配,我用空的

current_device
启动
string
,但后来为其分配了
int
。因此我尝试了这两种解决方法:

                current_device = 0
                current_device = None

但这并没有帮助。我什至尝试通过使用

string
启动它来引发对 device_name (分配了
int
)的警告:

                device_name = 0

但这完全可以接受!?!?

我在代码中搜索了这些变量名称,包含的代码片段是我使用它们的唯一地方。我已经阅读了这个问题(以及更多),但我认为那里的答案(除了禁用此警告)不适用于我的情况。

为什么我会收到此警告

current_device
??

python pycharm warnings compiler-warnings
1个回答
0
投票

出现警告“Shadows name 'current_device' from external scope”,因为 current_device 是在 if 块外部定义的,然后在其中重新分配的。这称为“阴影”,因为 PyCharm 检测到在更内部的上下文中重复使用相同的变量名称,这可能会导致混乱。

虽然在 if 块外部定义 current_device 有助于初始化它,但您可以通过仅在 if 块内定义 current_device 或在块内使用不同的名称来消除此警告。有两种方法可以解决这个问题:

-仅在 if 块内定义:这会删除警告并在块内保留 current_device 的使用。

device_name = ''

if torch.cuda.is_available():
    current_device = torch.cuda.current_device()
    device_name = torch.cuda.get_device_name(current_device)
else:
    current_device = ''  # Only if you need it assigned in the else

file_footer += f"{current_device}, {device_name}, model: {used_model}, {used_language}"

- 在 if 块中使用替代名称:这可以避免显式的“阴影”。

device_name = ''
device_id = 0  # Alternative to `current_device`

if torch.cuda.is_available():
    device_id = torch.cuda.current_device()
    device_name = torch.cuda.get_device_name(device_id)

file_footer += f"{device_id}, {device_name}, model: {used_model}, {used_language}"
© www.soinside.com 2019 - 2024. All rights reserved.