【问题标题】:Python style: use imported class as namespace for related custom data?Python 风格:使用导入的类作为相关自定义数据的命名空间?
【发布时间】:2013-07-20 00:49:50
【问题描述】:

我想知道是否可以使用导入的第 3 方类作为相关自定义变量的命名空间?说,下面的代码:

import pycurl

curlm = pycurl.CurlMulti()
curlm.pool = [pycurl.Curl() for i in range(POOL_SIZE)]
curlm.running = set()

在这个例子中,pycurl.CurlMulti 是一些 3rd-party 类,poolrunning 是我的变量(不是由 CurlMulti 提供的),但打算一起使用用卷曲。

【问题讨论】:

  • 如您所见,没有什么可以阻止您这样做,但是,您可能会无意中覆盖模块所依赖的某些内容并导致事情中断(或更糟 - 行为不端而没有中断)......所以我会说不要这样做

标签: python coding-style pep8


【解决方案1】:

不要这样做。你想要的是WeakKeyDictionary。您可以将任意值与任意对象相关联,而不必担心不同的模块会覆盖彼此的变量或 dict 使对象保持活动时间过长。

假设您编写了一个模块foo.py 来设置thing.whatever = 5。两个 Python 版本之后,thing 提供了一个 whatever 方法。一切都崩溃了,你甚至没有碰过你的代码。

假设您编写了一个模块foo.py 来设置thing.whatever = 5。两个月后,您正在处理一个不同的项目,并编写了一个模块bar.py,将thing.whatever = 4 设置在同一个thing 上。由于您几个月前做出的不相关的决定而发生了可怕的破坏。

【讨论】:

  • 第一个问题:通过在基类中添加一个新成员来覆盖子类的成员。第二个问题:在两个单独的翻译模块中重新定义一个成员变量。第三个问题:使用 import * 覆盖当前命名空间中的函数。就我个人而言,我不认为这些是能够抓住面向 OO 的程序员的陷阱。
  • 等等……他说的不是模块级常量。重写这个!
猜你喜欢
  • 2015-04-24
  • 2020-07-13
  • 2017-08-20
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2021-12-29
  • 2013-08-21
  • 2010-12-12
相关资源
最近更新 更多