How make your module substitute a python stdlib module.

Thomas Passin list1 at tompassin.net
Wed Dec 28 10:55:51 EST 2022


On 12/28/2022 5:39 AM, Antoon Pardon wrote:
> Op 27/12/2022 om 16:49 schreef Thomas Passin:
>> On 12/27/2022 8:25 AM, Antoon Pardon wrote:
>>>
>>>
>>> Op 27/12/2022 om 13:46 schreef Chris Angelico:
>>>> On Tue, 27 Dec 2022 at 23:28, Antoon Pardon<antoon.pardon at vub.be> 
>>>> wrote:
>>>>> At the moment I am happy with a solution that once the programmer has
>>>>> imported from QYZlib.threaders that module will used as the threading
>>>>> module.
>>>>>
>>>> Oh! If that's all you need, then yes, a simple patch of sys.modules
>>>> will work. You'll have to make sure you get your module imported
>>>> before anything else pulls up the vanilla one, though. Otherwise, your
>>>> only option is to keep the existing module object and monkeypatch it
>>>> with whatever changes you need.
>>>>
>>>> But a simple "sys.modules['threading'] = QYZlib.threaders" will work.
>>>> Of course, how *well* this works depends also on how well that module
>>>> manages to masquerade as the threading module, but I'm sure you've
>>>> figured that part out :)
>>>
>>> Well it is what will work for the moment. Thanks for the confirmation
>>> this will indeed work.
>>
>>
>> What you **should not** do is to make other modules use your code when 
>> they think they are using the standard library. Raymond Chen in The 
>> Old New Thing blog often writes about users who want to do a basically 
>> similar thing. He always asks "What if some other program wants to do 
>> the same thing?"  One case was when a developer wanted his program's 
>> icon to force itself to be at the top position in the Windows task 
>> bar. "What if another program tried this too?"  The two would keep 
>> trying to displace each other at the top position.
>>
>> If you set the PYTHONPATH environmental variable, you can put any 
>> directory you like to be at the start of the module search path after 
>> the current directory.  Perhaps this would be enough for your use case?
> 
> But if I put a threading.py file in that directory, it would make other 
> modules use my code when they "think" they are using the standard library.
> 
> The problem is that the logging module uses threading, but doesn't allow 
> you to specify which threading module to use. So if you want to use an 
> alternative, you either have to do things like this, or copy the logging 
> packages into your project and adapt it to use your alternative.

In that case, I think your best bet would be to write wrappers for the 
threading classes or functions you want to use.  Your wrappers would 
import from the threading module and could then produce the behavior you 
want.



More information about the Python-list mailing list