8.13. Functional Namespace¶
Functions provide namespaces
Only code inside that namespace can access it's locals
8.13.1. Variables Inside Function¶
Variables inside function
>>> def run():
... firstname = 'Mark'
... lastname = 'Watney'
Before call:
>>> firstname
Traceback (most recent call last):
NameError: name 'firstname' is not defined
>>>
>>> lastname
Traceback (most recent call last):
NameError: name 'lastname' is not defined
After call:
>>> run()
>>>
>>> firstname
Traceback (most recent call last):
NameError: name 'firstname' is not defined
>>>
>>> lastname
Traceback (most recent call last):
NameError: name 'lastname' is not defined
8.13.2. Functions Inside Function¶
Functions inside function
>>> def run():
... def say_hello():
... print('Hello')
...
... def say_goodbye():
... print('Goodbye')
>>> say_hello()
Traceback (most recent call last):
NameError: name 'say_hello' is not defined
>>>
>>> say_goodbye()
Traceback (most recent call last):
NameError: name 'say_goodbye' is not defined
>>> run()
>>>
>>> say_hello()
Traceback (most recent call last):
NameError: name 'say_hello' is not defined
>>>
>>> say_goodbye()
Traceback (most recent call last):
NameError: name 'say_goodbye' is not defined
8.13.3. Classes Inside Function¶
>>> def run():
... class Admin:
... pass
...
... class Guest:
... pass
>>> Admin()
Traceback (most recent call last):
NameError: name 'Admin' is not defined
>>>
>>> Guest()
Traceback (most recent call last):
NameError: name 'Guest' is not defined
>>> run()
>>>
>>> Admin()
Traceback (most recent call last):
NameError: name 'Admin' is not defined
>>>
>>> Guest()
Traceback (most recent call last):
NameError: name 'Guest' is not defined
8.13.4. Methods Inside Function¶
>>> def run():
... class Admin:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... class Guest:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
>>> Admin('Mark', 'Watney')
Traceback (most recent call last):
NameError: name 'Admin' is not defined
>>>
>>> Guest('Melissa', 'Lewis')
Traceback (most recent call last):
NameError: name 'Guest' is not defined
>>> run()
>>>
>>> Admin('Mark', 'Watney')
Traceback (most recent call last):
NameError: name 'Admin' is not defined
>>>
>>> Guest('Melissa', 'Lewis')
Traceback (most recent call last):
NameError: name 'Guest' is not defined
8.13.5. Instances Inside Function¶
>>> def run():
... class Admin:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... class Guest:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... mark = Admin('Mark', 'Watney')
... melissa = Guest('Melissa', 'Lewis')
>>> mark
Traceback (most recent call last):
NameError: name 'mark' is not defined
>>>
>>> melissa
Traceback (most recent call last):
NameError: name 'melissa' is not defined
>>> run()
>>>
>>> mark
Traceback (most recent call last):
NameError: name 'mark' is not defined
>>>
>>> melissa
Traceback (most recent call last):
NameError: name 'melissa' is not defined
8.13.6. All Together¶
>>> def run():
... firstname = 'Mark'
... lastname = 'Watney'
...
... def say_hello():
... print('Hello')
...
... def say_goodbye():
... print('Goodbye')
...
... class Admin:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... class Guest:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... mark = Admin('Mark', 'Watney')
... melissa = Guest('Melissa', 'Lewis')
8.13.7. Execute¶
>>> def run():
...
... def say_hello():
... print('Hello')
...
... def say_goodbye():
... print('Goodbye')
...
... say_hello()
... say_goodbye()
>>>
>>>
>>> result = run()
Hello
Goodbye
>>>
>>> print(result)
None
8.13.8. Return Results¶
>>> def run():
...
... def get_hello():
... return 'Hello'
...
... def get_goodbye():
... return 'Goodbye'
...
... return get_hello()
>>>
>>>
>>> run()
'Hello'
>>> def run():
...
... def get_hello():
... return 'Hello'
...
... def get_goodbye():
... return 'Goodbye'
...
... return get_hello(), get_goodbye()
>>>
>>>
>>> run()
('Hello', 'Goodbye')
8.13.9. Return Function¶
>>> def run():
... def say_hello():
... print('Hello')
...
... def say_goodbye():
... print('Goodbye')
...
... return say_hello
>>>
>>>
>>> hello = run()
>>> hello()
Hello
>>> def run():
... def say_hello():
... print('Hello')
...
... def say_goodbye():
... print('Goodbye')
...
... return say_hello, say_goodbye
>>>
>>>
>>> hello, goodbye = run()
>>>
>>> hello()
Hello
>>>
>>> goodbye()
Goodbye
>>> def run():
... class Admin:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... return Admin('Mark', 'Watney')
>>>
>>>
>>> mark = run()
>>>
>>> vars(mark)
{'firstname': 'Mark', 'lastname': 'Watney'}
8.13.10. Locals¶
>>> def run():
... firstname = 'Mark'
... lastname = 'Watney'
...
... def say_hello():
... print('Hello')
...
... def say_goodbye():
... print('Goodbye')
...
... class Admin:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... class Guest:
... def __init__(self, firstname, lastname):
... self.firstname = firstname
... self.lastname = lastname
...
... mark = Admin('Mark', 'Watney')
... melissa = Guest('Melissa', 'Lewis')
...
... print(locals())
>>> run()
{'firstname': 'Mark',
'lastname': 'Watney',
'say_hello': <function run.<locals>.say_hello at 0x...>,
'say_goodbye': <function run.<locals>.say_goodbye at 0x...>,
'Admin': <class '__main__.run.<locals>.Admin'>,
'Guest': <class '__main__.run.<locals>.Guest'>,
'mark': <__main__.run.<locals>.Admin object at 0x...>,
'melissa': <__main__.run.<locals>.Guest object at 0x...>}