On 05/09/18 15:06, Chip Wachob wrote: > Okay, I think I'm starting to get a handle on the visibility of > things. As you said, much different than C.
Yes. The significant thing is to remember that in Python you are importing names. In C you include the contents of the file. #include <stdio.h> Lets you access everything in the stdio.h file as if it were part of your own file. import sys Lets you see the sys module but not whats inside it. To access whats inside you must use the name as a prefix. The Pytho import idiom from sys import * is similar in effect to the C style include (although by an entirely different mechanism) but is considered bad practice (for the same reasons C++ has its scope operator(::)) > Even through the import Adafruit_GPIO as GPIO line exists in the > AdafruitInit.py file, which is imported by the import AdafruitInit > line in main.py, The critical conceptual error here is that the file is not imported(*), only the name. Importing in Python is all about visibility control (*)In practice although the module is not imported into your file it is executed, so any new variables, classes and functions are created, but their names are not visible in your code except via the module name. Let me revisit the different import styles in more detail. Remember we are discussing visibility of names not code. ############################## import modulename This makes modulename visible to the importing module. Nothing inside modulename is visible. To access the contents you must use modulename as a prefix. x = modulename.name1 ############################### import modulename as alias Exactly the same except that you can refer to modulename using the (usually shorter) alias. x = alias.name1 There are a few community standard aliases such as import numpy as np import tkinter as tk But they are purely conventions, you can use any alias you like. For those who enjoy typing they could even do import os as operating_system And access the functions as operating_system.listdir('.') instead of os.listdir('.') if they really wanted to... ################################ from module import name1, name2 This imports specific names from within module. You can now access name1 and name2 directly: x - name1 # accesses module.name1 But it does NOT import module itself, only name1, name2, etc. If you try x = module.name3 You will get an error about module (not name3!) not being recognised. ################################ from module import name1 as n1 Same as above but use the alias n1 instead of the longer name1. x = n1 # like x = module.name1 This is very like you doing the following: from module import name1 n1 = name1 ################################ from module import * This makes all the names defined in module visible within the importing module. Again it does not make module itself visible, only the names inside. This is considered bad practice because if you have multiple modules containing the same name (things like open() and write() are common then only the last name imported will be visible and that can lead to unexpected errors. HTH -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor