gpt4 book ai didi

python - 我如何猴子修补另一个包的管理类?

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:21 25 4
gpt4 key购买 nike

我的 Django 项目使用的一个包有一个简单的管理类,如下所示:

class EventUpdateInline(admin.StackedInline):
model = EventUpdate

class EventAdmin(admin.ModelAdmin):
form = EventForm
list_display = ('date_created', 'description', 'status', 'date_updated')
search_fields = ('description', 'message')
list_filter = ('services',)
inlines = [EventUpdateInline]

我编写了一个我想使用的自定义 EventUpdateInline 类。如何用我的 CustomEventUpdateInline 类替换 EventUpdateInline

这是第一个问题。问题的第二部分是我想向 EventUpdate 模型添加自定义属性,以便我的 CustomEventUpdateInline 类可以使用它。

我应该将我的代码放在哪里以导入我的 CustomEventUpdateInline 并替换旧代码并将自定义属性添加到 EventUpdate 模型?

我不确定这是否可能。谢谢

最佳答案

编辑:

tl;dr:fork 并改为使用 pip/virtualenv - 这是一种更清洁、可维护和理智的方法。猴子修补通常是一个糟糕的主意 - 请参阅链接到 SO answer。但有时它是较小的邪恶。

如果你想要一个快速而肮脏的猴子补丁 - https://stackoverflow.com/a/6720998/473285

但是现在通常如果项目是在 github 或 bitbucket 或者我只是克隆它的任何东西,进行我的更改然后使用 pip -e 安装我的克隆版本(你正在使用 virtualenv ,对吧?)。如果您认为您的更改将被上游接受,这是最好的方法。

要考虑的另一件事是向前兼容性。将第三方包更新到更高版本后,您的猴子补丁是否仍然有效?您在 git 中的更改会干净地合并吗?

通常我会在某些或所有这些罕见情况下使用猴子补丁:

  • 您正在编写一个分发包,但您需要修改另一个第三方包才能使其正常工作(很少见,仅在第三方维护者不接受补丁时有效)
  • 您正在对类、方法或函数进行相对直接的直接替换,这些类、方法或函数将与包的内部结构完全契合。
  • 代码不可用或形式不便于使用 pip/virtualenv(罕见)使用
  • 您认为代码不会升级或者您永远都需要升级(不太可能)
  • 您没有使用 pip/virtualenv(不好,但有时无法用于遗留、非常规或配置不当的安装)。
  • 您认为上游维护者永远不会接受您的更改,或者他们永远不会对其他任何人有用。

如果您正在做更多涉及的更改或更广泛有用的事情,那么最好经常 fork 然后尝试让上游接受。即使您的更改是为了促进永远不会在您的项目之外的任何地方使用的纯粹内部的东西,virtualenv 也是迄今为止更好的方法。

关于python - 我如何猴子修补另一个包的管理类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12910665/

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