我在 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
??
出现警告“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}"