Considere los siguientes scripts:
import_test1.py
:
from datetime import datetime
print(u'{}: {}'.format(__name__, datetime))
import import_test2
print(u'{}: {}'.format(__name__, datetime))
from datetime import datetime
print(u'{}: {}'.format(__name__, datetime))
import_test2.py
:
from datetime import datetime
print(u'{}: {}'.format(__name__, datetime))
import arcpy
print(u'{}: {}'.format(__name__, datetime))
from datetime import datetime
print(u'{}: {}'.format(__name__, datetime))
Al ejecutar esta secuencia de comandos, se puede ver que arcpy
es
C:\temp>py -2 .\import_test1.py
__main__: <type 'datetime.datetime'>
import_test2: <type 'datetime.datetime'>
import_test2: <type 'datetime.datetime'>
import_test2: <type 'datetime.datetime'>
__main__: <module 'datetime' (built-in)>
__main__: <type 'datetime.datetime'>
Este es un MCVE. (Me encontré con el problema de una manera más compleja, pero esto es suficiente para reproducir el comportamiento.)
Como se puede ver, la importación arcpy
(no haciendo un from arcpy import *
, sólo una llanura import arcpy
) es la sobreescritura de mi módulo de importación cuando se trata de la __main__
script. Sustituye el tipo me importados con el módulo del mismo nombre, que no es lo que necesito.
Sé que es arcpy porque puedo reproducir con un simple script:
from datetime import datetime
print(u'{}: {}'.format(__name__, datetime))
import arcpy
print(u'{}: {}'.format(__name__, datetime))
from datetime import datetime
print(u'{}: {}'.format(__name__, datetime))
Da:
C:\temp>py -2 .\import_test.py
__main__: <type 'datetime.datetime'>
__main__: <module 'datetime' (built-in)>
__main__: <type 'datetime.datetime'>
No quiero reordenar mi módulos porque quiero seguir PEP8 directrices del orden de las importaciones: la biblioteca estándar, tercero, la aplicación local/biblioteca específica de las importaciones. Esto también es difícil de manejar si algún otro módulo realiza la importación de arcpy
, como en mi módulo de dos ejemplo.
¿Cómo puedo obtener arcpy
para detener la sobreescritura de variables que no pertenecen a ella? ¿Por qué es incluso haciendo esto en primer lugar?