On 31/03/2023 15:01, Loris Bennett wrote:
Hi,
In my top level program file, main.py, I have
def main_function():
parser = argparse.ArgumentParser(description="my prog")
...
args = parser.parse_args()
config = configparser.ConfigParser()
if args.config_file is None:
config_file = DEFAULT_CONFIG_FILE
else:
config_file = args.config_file
config.read(config_file)
logging.config.fileConfig(fname=config_file)
logger = logging.getLogger(__name__)
do_some_stuff()
my_class_instance = myprog.MyClass()
def do_some_stuff():
logger.info("Doing stuff")
This does not work, because 'logger' is not known in the function
'do_some_stuff'.
However, if in 'my_prog/my_class.py' I have
class MyClass:
def __init__(self):
logger.debug("created instance of MyClass")
this 'just works'.
Take another look at your code -- you'll probably find
logger = logging.getLogger(__name__)
on the module level in my_class.py.
to 'do_some_stuff', but why is this necessary in this case but not in
the class?
Your problem has nothing to do with logging -- it's about visibility
("scope") of names:
>>> def use_name():
print(name)
>>> def define_name():
name = "Loris"
>>> use_name()
Traceback (most recent call last):
File "<pyshell#56>", line 1, in <module>
use_name()
File "<pyshell#52>", line 2, in use_name
print(name)
NameError: name 'name' is not defined
Binding (=assigning to) a name inside a function makes it local to that
function. If you want a global (module-level) name you have to say so:
>>> def define_name():
global name
name = "Peter"
>>> define_name()
>>> use_name()
Peter
--
https://mail.python.org/mailman/listinfo/python-list