gpt4 book ai didi

python - Odoo/ python : modules dependencies gone wrong?

转载 作者:行者123 更新时间:2023-11-28 19:13:07 25 4
gpt4 key购买 nike

我有这些模块:

base_module, module_1base_module_extendmodule_2

这些模块有这样的依赖关系:

  • module_1 依赖于 base_module
  • base_module_extend 依赖于 base_module
  • module_2 依赖于 base_module_extend

如果 module_1module_2 没有同时安装,那么一切正常,但如果安装了它们,那么依赖项会按照这些模块的安装顺序发生变化.

例如,如果我安装 module_2,然后安装 module_1,当我开始使用 module_2 时,您调用 super 在那个模块代码中,它首先找到在 base_module 而不是 base_module_extend 中定义的类,然后有些东西坏了,因为它没有找到一些定义的属性/参数在 base_module_extend 中。

如果我以相反的顺序安装:首先安装 module_1module_2,然后当我使用 module_2 时,它工作正常,因为它从 super 调用正确的类。

有没有办法让这些模块调用正确的父类,如果它们都被安装而不关心它们的安装顺序?

或者这是限制,您对此无能为力?..

更新

如果您以错误的顺序安装(第一种情况)会导致什么损坏的示例:

这是base_module中定义的方法:

def export_data(self, export_time=fields.Datetime.now()):
"""
This method can be overridden to implement custom data exportation
"""
self.ensure_one()
res = []
return res

这是在 module_1 中更改的方法:

def export_data(self, export_time=fields.Datetime.now()):
res = super(SFTPImportExport, self).export_data(export_time)
if self.process == 'custom_qty_available':
res = self._export_qty_available(export_time)
elif self.process == 'custom_sale':
res = self._export_sale(export_time)
return res

这是在 base_module_extend 中更改的方法:

def export_data(
self, export_time=fields.Datetime.now(), external_data=False):
"""
Overrides export_data to be able to provide external_data that
is already generated and can be directly returned to be used in export
@param export_time: time of export
@param external_data: used to bypass specific export
method and directly use data provided
"""
res = super(SFTPImportExport, self).export_data(export_time)

return res

这是在 module_2 中更改的相同方法:

def export_data(self, export_time=fields.Datetime.now(), external_data=False):
"""
Adds support for custom_invoice process
"""
res = super(SFTPImportExport, self).export_data(export_time=export_time, external_data=external_data)
if self.process == 'custom_invoice':
res = external_data
return res

更新2

当执行最后一个方法版本(在 module_2 中定义的那个)时,我得到这个错误:

"/opt/odoo/projects/project/sftp_import_export_extend/models/sftp_import_export.py", line 47, in export_sftp

export_time=now, external_data=external_data)

ValueError: "export_data() got an unexpected keyword argument 'external_data'" while evaluating

u'invoice_validate()'

所以看起来它得到了错误的父类,没有这样的关键字参数的父类

最佳答案

super() 倾向于在 Python 中选择错误的(意外的)父级。作为替代方案,您可以使用从所需父类(super class)直接调用 Python 函数,而不是使用 super(),这是更可靠的方法。

我不知道您的 Odoo 模块的目录结构和源文件名,所以我将尝试大致猜测该结构并向您说明应该做什么。请根据您的情况进行调整(具有正确的模块名称、源文件名称等)。

如果所需的 python 类,例如命名为 SFTPImportExport,其中包含所需的 export_data 方法,则在 base_module_extend 内的以下源文件中定义Odoo 模块(相对路径):base_module_extend/models/somefile.py 而不是使用 super(),您可以直接调用它,如下所示:

  • 导入所需的父类(super class):

    from openerp.base_module_extend.models.somefile import SFTPImportExport as ParentSFTPImportExport 
  • 然后直接调用它的方法:

    ParentSFTPImportExport.export_data(self, export_time=export_time, external_data=external_data)

在这种情况下,将调用您想要的确切函数,因为您直接引用它。我建议做同样的事情,即在两个模块中直接调用所需的函数,以确保它们永远不会混合目标函数。

关于python - Odoo/ python : modules dependencies gone wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37461841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com