为什么将Python系统类与自定义类合并比挂钩导入机制更不可取?

jsp*_*cek 15 python sockets networking distributed-system

我正在开发一个旨在通过部分订购信息扩充Python套接字消息的项目.我正在构建的库是用Python编写的,需要插入通过套接字函数发送的现有系统的消息.

我已经阅读了一些资源,即@Omnifarious在这个问题上的答案python- imports -from-builtin-library-when-module-with-name-name-exist

你可以做一件非常丑陋和可怕的事情,不涉及钩住进口机制.这是你可能不应该做的事情,但它可能会奏效.它将您的日历模块变为系统日历模块和日历模块的混合体.

我已经实现了导入机制解决方案,但我们已经决定这不是我们想要采取的方向,因为它过分依赖于环境.在我的情况下,将类合并为混合而不是依赖导入机制的解决方案似乎是最好的方法.

为什么混合动力被称为丑陋而可怕的解决方案?我想在我的项目中开始实现它,但我对这些警告很谨慎.它似乎有点hackish,但由于它将成为安装脚本的一部分,运行此一次不是没有问题吗?

这是一个代码片段,其中插入需要在发送之前拦截套接字消息:

class vector_clock:

  def __init__(self):
   """
   Initiate the clock with the object
   """
   self.clock = [0,0]

  def sendMessage(self):
   """
   Send Message to the server
   """
   self.msg = "This is the test message to that will be interposed on"
   self.vector_clock.increment(0) # We are clock position 0

   # Some extraneous formatting details removed for brevity….
   # connectAndSend needs interpositioning to include the vector clock

   self.client.connectAndSend(totalMsg);
   self.client.s.close()
Run Code Online (Sandbox Code Playgroud)

Bre*_*n F 2

根据我对您的帖子的理解,您希望修改现有的套接字库以将您自己的功能注入其中。

是的,这是完全可行的,甚至可能是解决您的问题的最简单的解决方案,但您必须考虑您正在做的事情的所有影响。

最重要的一点是,您不仅要为自己修改套接字,还要为进程中使用套接字库的任何部分中运行的任何东西修改套接字,除非它使用自己的类加载器。我知道您可能正在使用一些现有的库,它使用套接字,并且您想将此功能注入其中,但这会影响一切。

由此你必须考虑一个问题:你的改变是否100%向后兼容。除非您可以保证您知道进程使用的任何库的套接字的每个用例(提示:您不能),否则您需要确保它完全保留所有现有功能或其他地方的东西某些核心库会神秘地崩溃,您将不知道为什么,也无法调试它。100% 向后兼容(或尽可能接近)的一个例子是注入一个装饰器,它将计时信息保存到您自己的模块之一。

如果您完全理解这一点并且仍然认为您的解决方案是一个好的解决方案,那么我会说“去做吧”。但是,您是否考虑过任何替代方案?

如果您只需要为您使用的一组特定库注入此功能,那么我建议您执行修补之类的操作:https ://docs.python.org/3/library/unittest.mock.html#unittest.mock 。修补

您可以对要修改的任何核心库进行子类化,然后修补该库以使用您的类。补丁的核心作用是修改目标模块中使用的全局绑定,以使用与最初使用的不同的类/模块。

附言。我不认为你的情况需要挂钩导入机制。