是否可以从模块中删除方法?

时间:2015-04-28 10:47:37

标签: python python-2.7

我可以在python中从ready模块中删除方法吗?最近我试图在基于浏览器的交易平台上编写一个python代码,在这里他们允许你导入python' time'包但时间包没有sleep()方法。虽然我试图导入睡眠方法,但它给了我属性错误。在询问该平台的技术支持人员时,我知道他们不支持sleep()方法。我只是想知道我们怎么能这样做?它只是从包中删除方法?还是有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

可以在运行时从名称空间中删除方法(函数)。 这称为猴子修补。交互式会话中的示例:

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> time.sleep(2)
>>> del time.sleep
>>> time.sleep(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'sleep'

但回到原来的问题:我相信在您使用的平台上,他们可能已经用自定义版本替换了几个标准库模块(包括时间模块)。所以你应该问他们如何实现你想要的延迟,而不必忙于等待。

答案 1 :(得分:1)

import time
time.sleep(1)

del time.sleep
time.sleep(1)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-07a34f5b1e42> in <module>()
----> 1 time.sleep(1)

AttributeError: 'module' object has no attribute 'sleep'

答案 2 :(得分:1)

如果您没有time.sleep方法,您可以轻松编写自己的方法(虽然不太可能精确或有效):

def sleep(seconds):
    a = time.time()
    b = time.time()
    while b - a < seconds:
        b = time.time()

以下是我运行的一些精度测试(只有一个print语句来查看它进入循环的频率):

>>> sleep(1)
2.86102294922e-06
0.0944359302521
0.14835691452
0.198939800262
0.249089956284
0.299441814423
0.349442958832
0.398970842361
0.449244022369
0.498914003372
0.549893856049
0.600338935852
0.648976802826
0.700131893158
0.750012874603
0.800500869751
0.850263834
0.900727987289
0.950336933136
1.00087189674

精度保持在100英里秒精度。 :) 您可能没有这个方法,因为他们修改了源代码,或者在代码开始执行之前在解释器上运行了一些东西(使用del关键字,就像在其他答案中一样)。