Введение
В этом практическом занятии (лабораторной работе) вы научитесь проверять, содержит ли модуль Python определенный атрибут. Это включает исследование атрибутов модуля, использование функции hasattr() и безопасный доступ к атрибутам с помощью getattr().
Сначала вы создадите простой модуль с именем my_module.py, содержащий переменную и функцию. Затем вы создадите скрипт explore_module.py для импорта my_module и исследования его атрибутов с использованием __name__ и __dict__, а также прямого доступа через точечную нотацию. Наконец, вы запустите скрипт, чтобы увидеть атрибуты модуля.
Исследование атрибутов модуля
На этом этапе вы научитесь исследовать атрибуты модуля Python. Модули являются основными строительными блоками в Python, и понимание их атрибутов является важным аспектом эффективного программирования. Атрибутами могут быть переменные, функции или даже другие модули, определенные внутри модуля.
Сначала создадим простой модуль Python с именем my_module.py в директории ~/project. Вы можете использовать редактор VS Code для создания этого файла.
## ~/project/my_module.py
my_variable = 10
def my_function():
return "Hello from my_module!"
В этом модуле определена переменная my_variable и функция my_function. Теперь создадим другой скрипт Python с именем explore_module.py в той же директории ~/project, чтобы исследовать атрибуты my_module.py.
## ~/project/explore_module.py
import my_module
print("Module name:", my_module.__name__)
print("Module dictionary:", my_module.__dict__)
print("Variable from module:", my_module.my_variable)
print("Function from module:", my_module.my_function())
В этом скрипте:
- Мы импортируем модуль
my_module. - Используем
my_module.__name__для вывода имени модуля. - Используем
my_module.__dict__для вывода словаря, содержащего атрибуты модуля. - Обращаемся к атрибутам
my_variableиmy_functionнапрямую с помощью точечной нотации.
Теперь выполним скрипт explore_module.py с помощью следующей команды в терминале:
python ~/project/explore_module.py
Вы должны увидеть вывод, похожий на следующий:
Module name: my_module
Module dictionary: {'__name__': 'my_module', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x...>, '__spec__': None, '__file__': '/home/labex/project/my_module.py', '__cached__': None, '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions and constants etc.", '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__build_class__': <built-in function __build_class__>, '__import__': <built-in function __import__>, 'abs': <built-in function abs>, 'all': <built-in function all>, 'any': <built-in function any>, 'ascii': <built-in function ascii>, 'bin': <built-in function bin>, 'breakpoint': <built-in function breakpoint>, 'callable': <built-in function callable>, 'chr': <built-in function chr>, 'compile': <built-in function compile>, 'complex': <class 'complex'>, 'delattr': <built-in function delattr>, 'dict': <class 'dict'>, 'dir': <built-in function dir>, 'divmod': <built-in function divmod>, 'enumerate': <class 'enumerate'>, 'eval': <built-in function eval>, 'exec': <built-in function exec>, 'filter': <class 'filter'>, 'float': <class 'float'>, 'format': <built-in function format>, 'frozenset': <class 'frozenset'>, 'getattr': <built-in function getattr>, 'globals': <built-in function globals>, 'hasattr': <built-in function hasattr>, 'hash': <built-in function hash>, 'help': <built-in function help>, 'hex': <built-in function hex>, 'id': <built-in function id>, 'input': <built-in function input>, 'int': <class 'int'>, 'isinstance': <built-in function isinstance>, 'issubclass': <built-in function issubclass>, 'iter': <built-in function iter>, 'len': <built-in function len>, 'list': <class 'list'>, 'locals': <built-in function locals>, 'map': <class 'map'>, 'max': <built-in function max>, 'memoryview': <class 'memoryview'>, 'min': <built-in function min>, 'next': <built-in function next>, 'object': <class 'object'>, 'oct': <built-in function oct>, 'open': <built-in function open>, 'ord': <built-in function ord>, 'pow': <built-in function pow>, 'print': <built-in function print>, 'property': <class 'property'>, 'range': <class 'range'>, 'repr': <built-in function repr>, 'reversed': <class 'reversed'>, 'round': <built-in function round>, 'set': <class 'set'>, 'setattr': <built-in function setattr>, 'slice': <class 'slice'>, 'sorted': <built-in function sorted>, 'staticmethod': <class 'staticmethod'>, 'str': <class 'str'>, 'sum': <built-in function sum>, 'super': <class 'super'>, 'tuple': <class 'tuple'>, 'type': <class 'type'>, 'vars': <built-in function vars>, 'zip': <class 'zip'>, '__import_submodule__': <built-in function __import_submodule__>, '__import_module__': <built-in function __import_module__>, 'warning': <class 'Warning'>, 'warn': <built-in function warn>, 'ImportWarning': <class 'ImportWarning'>, 'PendingDeprecationWarning': <class 'PendingDeprecationWarning'>, 'DeprecationWarning': <class 'DeprecationWarning'>, 'SyntaxWarning': <class 'SyntaxWarning'>, 'RuntimeWarning': <class 'RuntimeWarning'>, 'FutureWarning': <class 'FutureWarning'>, 'UserWarning': <class 'UserWarning'>, 'BytesWarning': <class 'BytesWarning'>, 'UnicodeWarning': <class 'UnicodeWarning'>, 'EncodingWarning': <class 'EncodingWarning'>, 'ResourceWarning': <class 'ResourceWarning'>}, 'my_variable': 10, 'my_function': <function my_function at 0x...>
Variable from module: 10
Function from module: Hello from my_module!
Этот вывод показывает имя модуля, его словарь атрибутов и значения переменной и функции, определенных в модуле. Исследование атрибутов модуля является важным шагом в понимании того, как эффективно использовать и взаимодействовать с модулями Python.
Использование hasattr() с модулем
На этом этапе вы научитесь использовать функцию hasattr() для проверки наличия определенного атрибута в модуле. Это полезный прием для написания надежного кода, который может обрабатывать модули с различными наборами атрибутов.
Продолжая с предыдущего шага, у нас уже есть модуль с именем my_module.py в директории ~/project. Давайте воспользуемся им снова.
## ~/project/my_module.py
my_variable = 10
def my_function():
return "Hello from my_module!"
Теперь изменим скрипт explore_module.py, чтобы использовать функцию hasattr() для проверки наличия атрибутов в my_module.py.
## ~/project/explore_module.py
import my_module
if hasattr(my_module, 'my_variable'):
print("my_module has attribute my_variable")
else:
print("my_module does not have attribute my_variable")
if hasattr(my_module, 'my_function'):
print("my_module has attribute my_function")
else:
print("my_module does not have attribute my_function")
if hasattr(my_module, 'non_existent_attribute'):
print("my_module has attribute non_existent_attribute")
else:
print("my_module does not have attribute non_existent_attribute")
В этом скрипте:
- Мы используем
hasattr(my_module, 'my_variable')для проверки, есть ли вmy_moduleатрибут с именемmy_variable. - Мы используем
hasattr(my_module, 'my_function')для проверки, есть ли вmy_moduleатрибут с именемmy_function. - Мы используем
hasattr(my_module, 'non_existent_attribute')для проверки, есть ли вmy_moduleатрибут с именемnon_existent_attribute.
Теперь выполните скрипт explore_module.py с помощью следующей команды в терминале:
python ~/project/explore_module.py
Вы должны увидеть вывод, похожий на следующий:
my_module has attribute my_variable
my_module has attribute my_function
my_module does not have attribute non_existent_attribute
Этот вывод показывает, что функция hasattr() правильно определяет существующие атрибуты (my_variable и my_function) и несуществующий атрибут (non_existent_attribute). Использование hasattr() позволяет вам писать код, который элегантно обрабатывает модули с разными наборами атрибутов, делая ваш код более гибким и надежным.
Безопасный доступ с помощью getattr()
На этом этапе вы научитесь использовать функцию getattr() для безопасного доступа к атрибутам модуля. Функция getattr() позволяет указать значение по умолчанию, если атрибут не существует, что предотвращает аварийное завершение программы.
Продолжая с предыдущих шагов, у нас уже есть модуль с именем my_module.py в директории ~/project. Давайте воспользуемся им снова.
## ~/project/my_module.py
my_variable = 10
def my_function():
return "Hello from my_module!"
Теперь изменим скрипт explore_module.py, чтобы использовать функцию getattr() для доступа к атрибутам в my_module.py с указанием значения по умолчанию.
## ~/project/explore_module.py
import my_module
variable_value = getattr(my_module, 'my_variable', 'Default Value')
print("Value of my_variable:", variable_value)
function_value = getattr(my_module, 'my_function', lambda: "Default Function")
print("Value of my_function:", function_value())
non_existent_value = getattr(my_module, 'non_existent_attribute', 'Attribute Not Found')
print("Value of non_existent_attribute:", non_existent_value)
В этом скрипте:
- Мы используем
getattr(my_module, 'my_variable', 'Default Value')для доступа кmy_variable. Еслиmy_variableсуществует, его значение присваивается переменнойvariable_value. В противном случае переменнойvariable_valueприсваивается значение по умолчанию'Default Value'. - Мы используем
getattr(my_module, 'my_function', lambda: "Default Function")для доступа кmy_function. Еслиmy_functionсуществует, она присваивается переменнойfunction_value. В противном случае переменнойfunction_valueприсваивается анонимная функция по умолчанию, которая возвращает"Default Function". Затем мы вызываем функцию с помощьюfunction_value(). - Мы используем
getattr(my_module, 'non_existent_attribute', 'Attribute Not Found')для доступа кnon_existent_attribute. Поскольку этот атрибут не существует, переменнойnon_existent_valueприсваивается значение по умолчанию'Attribute Not Found'.
Теперь выполните скрипт explore_module.py с помощью следующей команды в терминале:
python ~/project/explore_module.py
Вы должны увидеть вывод, похожий на следующий:
Value of my_variable: 10
Value of my_function: Hello from my_module!
Value of non_existent_attribute: Attribute Not Found
Этот вывод демонстрирует, как функция getattr() безопасно обращается к атрибутам, предоставляя значения по умолчанию, когда атрибуты не найдены. Этот прием является важным для написания надежного и гибкого кода на Python.
Резюме
В этом практическом занятии (лабораторной работе) вы научились исследовать атрибуты модуля Python. Это включало создание простого модуля с именем my_module.py, содержащего переменную и функцию.
Затем вы создали скрипт explore_module.py для импорта и изучения атрибутов модуля. Вы использовали __name__ для получения имени модуля, __dict__ для просмотра словаря модуля и прямую точечную нотацию для доступа к конкретным переменным и функциям внутри модуля. В конце вы выполнили скрипт, чтобы увидеть атрибуты модуля.



