相关疑难解决方法(0)

模块上的__getattr__

如何__getattr__在模块上实现类的等价?

当调用模块静态定义的属性中不存在的函数时,我希望在该模块中创建一个类的实例,并在模块上的属性查找中使用与失败相同的名称调用其上的方法.

class A(object):
    def salutation(self, accusative):
        print "hello", accusative

# note this function is intentionally on the module, and not the class above
def __getattr__(mod, name):
    return getattr(A(), name)

if __name__ == "__main__":
    # i hope here to have my __getattr__ function above invoked, since
    # salutation does not exist in the current namespace
    salutation("world")
Run Code Online (Sandbox Code Playgroud)

这使:

matt@stanley:~/Desktop$ python getattrmod.py 
Traceback (most recent call last):
  File "getattrmod.py", line 9, in <module>
    salutation("world")
NameError: name 'salutation' is not …
Run Code Online (Sandbox Code Playgroud)

python module attributeerror getattr python-3.x

114
推荐指数
7
解决办法
4万
查看次数

有没有办法让python pickle忽略"它不是同一个对象"的错误

有没有办法让python pickle忽略"它不是同一个对象"的错误?

我正在使用Mock编写一个测试,对datetime.utcnow()产生的结果进行细粒度控制.我正在使用的代码是时间敏感的,因此mock的补丁使其易于测试.

相同的测试需要pickle对象并将结果发送到远程服务器.为了测试的目的,如果远程服务器腌制和接收标准日期时间,一切都会好的.

不幸的是,pickle模块正在发生以下错误:

无法pickle <type'datetime.datetime'>:它与datetime.datetime不是同一个对象

这是重现错误的最小示例.

from mock import patch
from datetime import datetime
import pickle

class MockDatetime(datetime):
  frozendt = datetime(2011,05,31)

  @classmethod
  def advance(cls, **kw):
    cls.frozendt = cls.frozendt + timedelta(**kw)

  @classmethod
  def utcnow(cls):
    return cls.frozendt

@patch('datetime.datetime', MockDatetime)
def test():
  pickle.dumps(datetime.utcnow())

if __name__ == '__main__':
  test()
Run Code Online (Sandbox Code Playgroud)

是否有一些组合 __reduce____getstate__方法可能会欺骗泡菜机器思考MockDatetime是一个日期时间,当我腌制?

python datetime mocking pickle

6
推荐指数
2
解决办法
4237
查看次数