python - Is it OK to name an instance the same as a module? -


i find 'natural' name both module containing class definition , instances of class in lowercase, , use camel-case class name. example, want this:

in [2]: publisher import publisher  in [3]: publisher = publisher() 

here have module named publisher, instance of publisher called same way. seems module , instance both 'work' expected:

in [4]: publisher import randomdata  in [5]: publisher.random.uuid() out[5]: 'c490508d-2071-536e-2f38-4b03b04351e1' 

where i've imported class module , called instance method. python 'understand context' whether mean module or instance? ok re-use names in way?

you not shadowing anything, no name being reused here. name publisher not being used in namespace until created instance publisher = publisher(). if tried use name publisher right after from publisher import publisher line, you'd nameerror exception.

that's because from <module> import <name> form sets <name> in namespace. doesn't matter <name> imported from; @ no point <module> name in namespace.

put differently, from publisher import publisher statement translates to:

if 'publisher' not in sys.modules:     # find , load publisher module     # sys.modules['publisher'] = newly_loaded_module publisher = sys.modules['publisher'].publisher  # set publisher global 

except name sys never set in namespace, python accesses sys.modules directly internally.

so, technical point of view: no, fine.

you may find using module name instance variable can create confusion name refers to future reader of code, if not python.

you may have gotten confused with

import publisher publisher = publisher.publisher() 

that would shadow module. line import publisher sets global name publisher, , on next line replace publisher new object reference.

cast same sys.modules language, you'd doing this:

if 'publisher' not in sys.modules:     # find , load publisher module     # sys.modules['publisher'] = newly_loaded_module publisher = sys.modules['publisher']  # set publisher global publisher = publisher.publisher()     # set publisher global else 

that's fine too, unless expect publisher.publisher() work again later on. publisher no longer references module, cause issues. yet more confusing human readers.


Comments

Popular posts from this blog

aws api gateway - SerializationException in posting new Records via Dynamodb Proxy Service in API -

asp.net - Problems sending emails from forum -