【问题标题】:Casting Constructor in Python在 Python 中强制转换构造函数
【发布时间】:2021-04-22 00:43:48
【问题描述】:

我正在使用严格类型的 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中有什么东西吗?

【问题讨论】:

  • 严格类型的 Python 是什么意思? Python 使用鸭子类型,并且不会在您的代码示例中强制使用可选的类型注释。
  • 你应该已经能够做到(例如)CallerSurface("ios_application")。您还可以使用另一个 CallerSurface 实例调用 CallerSurface 构造函数,这为您提供了一种相当简单地将 Union[CallerSurface, str] 转换为 CallerSurface 的方法。

标签: python casting copy-constructor move-constructor


【解决方案1】:

没有办法自动进行转换(没有您正在寻找的那种隐式类型转换之类的东西),所以您的选择是:

  1. 扩展允许的参数类型(caller_name: CallerSurface 变为 caller_name: Union[CallerSurface, str]),手动将相关类型转换为预期类型,或
  2. Use @functools.singledispatch 制作函数的多个版本,一个接受每种类型,其中除了一个实现之外的所有实现都只是转换为预期的类型并调用自己

简而言之,这不是 C++,一般情况下也不是隐式类型转换。

【讨论】:

    【解决方案2】:

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

    我认为你想要做的是将输入保留为CallerSurface,并使用静态类型检查器强制调用者执行(例如):

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      相关资源
      最近更新 更多