当前位置: 首页 > 知识库问答 >
问题:

形窄联

燕智
2023-03-14

如何按形状缩小联合体?我不想用isinstance或手动转换来检查实际类型(有很多类型)

class X:
    title = "1"
class Y:
    name = "2"
class Z:
    name = "3"

for (i, r) in enumerate([X(), Y(), Z()]): # type of r: X | Y | Z

    if hasattr(r, "title"):
        print(r.title) # error
    else:
        print(r.name)  # error

类型检查错误显示:

(variable) title: str | Unknown
Cannot access member "title" for type "Y"
  Member "title" is unknown
Cannot access member "title" for type "Z"
  Member "title" is unknown

(variable) name: Unknown | str
Cannot access member "name" for type "X"
  Member "name" is unknown

共有1个答案

滑弘扬
2023-03-14

在您的案例中,有几种方法可以欺骗Pylance检查器:

class X:
    title = "1"
class Y:
    name = "2"
class Z:
    name = "3"

for (i, r) in enumerate([X(), Y(), Z()]): # type of r: X | Y | Z

    if hasattr(r, "title"):
        print(r.title) # type: ignore
    else:
        print(r.name) # type: ignore

class X:
    title = "1"
class Y:
    name = "2"
class Z:
    name = "3"

for (i, r) in enumerate([X(), Y(), Z()]): # type of r: X | Y | Z

    if hasattr(r, "title"):
        print(getattr(r, "title"))
    else:
        print(getattr(r, "name"))
 类似资料:
  • 宽字符 #include <stdio.h> #include <stdlib.h> #include <Windows.h> //01.宽窄字符的使用特点: // 1.宽窄字符变量的使用特点: // (1).只是存储数据的格子大小不一样,窄字符小,宽字符大 // (2).如果存储相同的数据,只要不发生数据越界,或者存储的数据即使越界 // 但是打印的时候

  • (译注:“窄转换”是我见到过的一个翻译术语,但我忘记是在那本书上看到的。此处也可译为“预防类型截断”或者“预防类型切割”。) 问题现象:C和C++会进行隐式的(类型)截断 int x = 7.3; // 啊哦! void f(int); f(7.3); // 啊哦! 但是,在C++11中,使用{}进行初始化不会发生这种窄转换(译注:也就是使用{}对变量进行初始化时,不会进行隐

  • 我正在使用不同作用域的bean开发一个Spring应用程序。许多bean是单例的,有其他请求或自定义的作用域。特别是,使用这些自定义作用域有时很难找出哪个作用域可以安全地注入到其他作用域中,或者何时需要使用。 我知道我可以为所有基本上不是单例的bean创建范围代理,但在许多情况下,这似乎是不必要的。例如,一个bean可能只应该被注入到相同范围的其他bean,但并不是每个在项目中工作的人都知道这一点

  • 问题内容: 我正在尝试将html实体转换为unichar,html实体是 当我尝试执行以下操作时: 我收到以下错误消息: 似乎超出了unichar的范围转换范围。 问题答案: 您可以使用以下编码对具有Unicode转义符(后跟8个十六进制数字,零填充)的字符串进行解码: 在狭窄的版本中,它存储为UTF-16代理对: 在编码过程中,此代理对已作为代码单元正确处理:

  • 为什么if片段内的isCache类型被收窄为true,而else片段内的isCache类型推导是boolean。我预期的是else片段内的isCache类型应该推导为false,求解答。 尝试了一下应该不是编辑器的问题。