Waarom importeren Python-modules soms hun submodules niet?

Ik heb vandaag iets raars opgemerkt dat ik graag zou willen uitleggen. Ik wist niet 100% zeker hoe ik dit zelfs als een vraag moest formuleren, dus Google is uitgesloten. De logging module heeft om een ​​vreemde reden geen toegang tot de module logging.handlers. Probeer het zelf als je me niet gelooft:

>>> import logging
>>> logging.handlers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'>

Kan iemand uitleggen waarom dit gebeurt?


Antwoord 1, autoriteit 100%

In Python moeten modules worden geïmporteerd voordat ze toegankelijk zijn. import loggingimporteert alleen de registratiemodule. Het gebeurt zo dat loggingeen pakket is met submodules, maar die submodules worden nog steeds niet automatisch geladen. Je moet dus expliciet logging.handlersimporteren voordat je er toegang toe hebt.

Als je je afvraagt ​​waarom het soms lijkt alsof je die extra imports niet nodig hebt: sommige pakketten importeren sommige of al hun submodules wanneer ze worden geïmporteerd — gewoon door die imports uit te voeren in hun __init__.pybestanden. In andere gevallen kan het zijn dat u iets anders importeert, ook geïmporteerde logging.handlers. Het maakt niet uit welk stuk code de import doet; zolang ietsin uw proces logging.handlersimporteert voordat u het opent, zal het daar zijn. En soms is een module die eruitziet als een pakket dat eigenlijk niet, zoals osen os.path. osis geen pakket, het importeert alleen de juiste andere module (voor je platform) en noemt het path, zodat je er toegang toe hebt als os.path.


Antwoord 2, autoriteit 3%

Ik ben ook nieuw in python en na veel oefenen kan ik nu onderscheid maken tussen,
pakket (map) , module(.py) , klassen,variabelen…etc…

als je wilt dat een van je mappen een python-pakket is – het moet een bestand __init__.pybevatten, zelfs een leeg bestand is voldoende!!!

en zoals Thomas al zei, je kunt extra module importeren in __init__.py als je wilt !!! maar modules/pakketten zijn alleen toegankelijk na het importeren…

als je alles uit een module wilt importeren, kun je

. gebruiken

from logging import *

rust, je hebt ook toegang tot de handlers-module zoals hieronder,

from logging import handlers
print dir(handlers)


Antwoord 3, autoriteit 2%

Thomas Woutersbeantwoordde deze vraag heel goed, maar helaas vond ik deze vraag pas nadat ik het antwoord vond in de originele documentatie. Daarom dacht ik hieraan iets toe te voegen in de hoop dat het in de toekomst dichter bij de top van de zoekmachine komt te staan.

VRAAG

Waarom verschijnt de fout: ‘AttributeError: module ‘module_name‘ heeft geen attribuut ‘sub_module_name‘ zelfs
hoewel mijn editor (bijv. Visual Code) de submodule automatisch aanvult
naam:

import module_name
 module_name.sub_module_name(parameter)

ANTWOORD

Uw editor baseert zijn autocomplete op de bestandsstructuur van uw project en niet op Python-gedrag. Sub-modules zijn niet
‘automatisch’ geïmporteerd als je een module importeert. Raadpleeg Python-documentatievoor details over het ‘automatisch’ importeren van sub- modules bij gebruik van

import module_name

De belangrijkste bijdrage aan dit antwoord is de toevoeging van AttributeError bij het importeren van een ‘module’ of ‘pakket’

Ik hoop dat dit iemand helpt!


Antwoord 4

Ik heb onlangs met dezelfde vreemde situatie te maken gehad. Dus ik wed dat je een lib-import van derden hebt verwijderd. Dat verwijderde lib bevatte
from logging import handlersof from logging import *en hebben u handlersgegeven. En in een ander script had je zoiets als import loggingen gebruikte je gewoon logging.handlersen je dacht dat de dingen op die manier werken zoals ik deed.

Other episodes