Python中的强制转换构造函数

2024-09-28 22:30:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是严格类型化的Python,并希望实现类似于C++复制/移动构造函数重载的一些东西。也就是说,我想使用显式定义将我的对象转换为另一种类型

下面是一个例子:

class CallerSurface(StringEnum):
  IOS_APPLICATION = "ios_application"
  ANDROID_APPLICATION = "android_application"
  WEB_APPLICATION = "web_application"

我可以将其与一些功能一起使用,例如:

  def getResponse(data: Data, caller_name: CallerSurface) -> str:

我想在类CallerSurface的定义中添加一些内容,使一个函数可以接受CallerSurface类型的参数,也可以接受str类型的参数,并且“知道”如何将str转换为CallerSurface,而无需程序员显式地进行转换

因此,我想以以下方式使用:

  caller_name: str = HTTPUtils.extractCallerFromUserAgent(request)
  response = getResponse(other_data, caller_name)

caller_name是一个str,但getResponse采用CallerSurface。我想在CallerSurface类中隐式定义转换

<>在C++中,你可以通过定义一个拷贝和一个移动的构造函数来实现这个。Python中是否有用于此的内容


Tags: 对象name类型内容data参数定义application
2条回答

Python不会隐式地进行类型转换。它确实提供了__str__魔术方法之类的功能,但这种转换仍然需要显式调用str()函数

我认为,您要做的是将键入保留为CallerSurface,并使用静态类型检查器强制调用方执行以下操作(例如):

  caller_name = HTTPUtils.extractCallerFromUserAgent(request)
  response = getResponse(other_data, CallerSurface(caller_name))

使用类型检查器(例如mypy)是关键,因为这使得不可能忘记CallerSurface调用(或者需要进行的任何其他类型的转换)

没有办法自动进行转换(没有您正在寻找的隐式类型转换),因此您可以选择:

  1. 展开允许的参数类型(caller_name: CallerSurface变为caller_name: Union[CallerSurface, str]),手动将相关类型转换为所需类型,或
  2. Use ^{}生成函数的多个版本,每个版本接受每个类型,其中除了一个实现之外的所有实现都只转换为预期的类型并调用自身
简而言之,这不是C++,隐式类型转换不是一般情况下的事情。

相关问题 更多 >