微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 中的铸造构造函数

如何解决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 中有什么东西可以解决这个问题吗?

解决方法

没有办法自动转换(没有您正在寻找的类型的隐式类型转换),所以您的选择是:

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

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

,

Python 不会隐式进行类型转换。它确实提供了诸如 <button class="inputclass" id="filterBtn" onClick=""> Filter </button> 魔术方法之类的东西,但这种转换仍然需要显式调用 __str__ 函数。

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

CallerSurface

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。