我有一个很常见的设计问题:我需要为Google App Engine中的记录实现历史记录(审计跟踪).历史日志必须是结构化的,即我不能将所有更改加入到一些自由格式文本中并存储在字符串字段中.
我已经考虑了历史模型的以下选项,并且在注意到选项#1中的性能问题之后,我选择实现选项#3.但是,如果这个解决方案是高效和可扩展的,那么我们会有些怀疑.例如:随着选项#3中动态属性数量的增加,性能是否会显着下降?
您是否对每个选项的优缺点有更深入的了解,或者可以建议适用于Google App Engine数据库特征的其他审计跟踪设计模式?
fieldName创建history_fieldName_n字段(其中n = <0..N>是一些历史记录)
fieldName创建一个fieldName_history列表字段
我有一个使用C++库的django应用程序(通过swig导入).C++库启动自己的线程,该线程在Python代码中调用回调.
我无法在python代码中设置断点,在PyDev和PyCharm中也是如此.也试过'gevent compatibility'选项也没有运气.
我验证了回调被正确调用,因为logging.info转储了预期的内容.在其他线程中设置的断点工作正常.因此,似乎python调试器无法管理在非python代码中创建的线程调用的python代码中的断点.
有没有人知道解决方法?也许我可以使用一些"魔术"线程初始化序列?
最终类用户可能想创建一个由Base和组成的类Mixin(Mixin在第三方库类上提供了其他通用功能)。
但是,Mixin.__init__当按以下方式使用时不会调用。仅Base.__init__称为:
>>> class Base(object): #3rd party library class
... def __init__(self): print "Base"
...
>>> class Mixin(object): #my features useful as addendum for a few classes
... def __init__(self): print "Mixin"
...
>>> class C(Base, Mixin): pass
...
>>> c = C()
Base
Run Code Online (Sandbox Code Playgroud)
如何执行调用都Mixin.__init__和Base.__init__在这种情况下,无需用户记住把一个构造函数super()在C级呼叫?
>>> class Base(object):
... def __init__(self): print "Base"
...
>>> class Mixin(object):
... def __init__(self): print "Mixin"
...
>>> …Run Code Online (Sandbox Code Playgroud)