【问题标题】:Python confusing argumentsPython 令人困惑的论点
【发布时间】:2020-05-17 14:53:09
【问题描述】:

有时,python 的动态类型系统让人难以理解为什么有些东西会起作用。例如:

  • 为什么 pandas.read_sql()接受并按预期工作从 pymysql.connect() 返回的 pymysql.Connection 对象? 注意,pandas 文档中没有任何地方指出接受 pymysql.Connection 对象。

我正在寻找对上述问题的一些澄清一些关于如何概括类似情况的建议。

【问题讨论】:

  • 你是什么意思,“为什么”?你可以传递任何你想要的值,只要它可以以函数尝试使用它的方式使用。
  • @chepner 查看编辑
  • 这是一个比 SO 更适合pandas 用户的问题。据我所知,代码没有问题,而是为什么开发人员选择按照他们的方式做某事。
  • @EdekiOkoh 不是,和python有关,我只是举了一个可以泛化的例子。
  • 显然,pandas.read_sql 在内部所做的事情恰好适用于 pymysql.Connection 实例。你可能会问为什么“交替踩下左右踏板”让自行车和汽车都前进,即使这个程序只是为自行车设计的。用汽车来做这件事,或者将pandas.read_sqlpymysql.Connection 一起使用不是一个好主意。

标签: python python-3.x pandas pymysql pandasql


【解决方案1】:

read_sql 记录为采用Connectable 对象。严格来说,这意味着它将是SqlAlchemy.engine.Connectable 的实例或其子类,但唯一重要的是它表现 像这样的实例。粗略地说,你可以传递任何“类似于”Connectable 的东西,例如,tt 提供了一个 connect 方法,它采用与 sqlalchemy.engine.Connectable.connect 相同类型的参数。

换句话说,重要的不是确切的类型,而是您传递的类型的接口。 Python 将此称为鸭子类型:如果一个对象看起来像鸭子并且行为也像鸭子,那么它可以被需要鸭子的东西使用,即使它实际上不是鸭子。

【讨论】:

  • 有时,接口才是最重要的,但除非明确说明接口才是最重要的,否则更常见的情况是代码需要特定类型但并非旨在检查该前提条件.当一个新的库版本稍微改变一些东西并触发不同的隐式检查时,依赖于对其他类型的无证支持很快就会崩溃。
  • 例如,新版本尝试执行== 比较,这通常涉及类型检查,或者新版本尝试在假定为列表的内容上调用未绑定的list.index 方法, 触发 self 类型检查未绑定的 C 方法。
猜你喜欢
  • 2012-09-22
  • 2013-08-23
  • 1970-01-01
  • 2022-01-21
  • 2022-01-17
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
相关资源
最近更新 更多