Python узнать методы функции

Модуль inspect в Python

Модуль inspect Python – очень полезный модуль, который используется для интроспекции объектов в программе и просмотра исходного кода модулей, классов и функций, которые используются во всей программе.

Модуль фактически может использоваться для извлечения исходного кода самой функции, анализа аргументов, которые эта функция принимает.

Предоставление образца модуля

Сейчас мы создадим образец модуля с некоторыми функциями, классами и строками документации в Python. Вот фрагмент кода для sample.py:

def module_funct(arg1, arg2 = 'default', *args): """This is a module-level function.""" local_var = arg1 * 3 return local_var class X(object): """Definition for X class.""" def __init__(self, name): self.name = name def get_name(self): "Returns the name of the instance." return self.name x_obj = X('sample_instance') class Y(X): """This is the Y class, child of X class. """ # This method is not part of X class. def do_something(self): """Anything can be done here.""" def get_name(self): "Overrides version from X" return 'Y(' + self.name + ')'

Теперь, когда у нас есть образец модуля, готовый к использованию, мы можем начать извлекать и анализировать его исходный код, строку документации и детали объекта. Давайте начнем.

Читайте также:  Css text animation effects

Изучение модуля

Давайте начнем с самоанализа определенного нами образца модуля. Обратите внимание, что для этого у нас есть файл образца модуля sample.py в том же каталоге, в котором мы выполняем наши скрипты. Вот фрагмент образца кода о том, как мы можем проверить наш модуль:

import inspect import sample for name, data in inspect.getmembers(sample): if name.startswith('__'): continue print('<> : '.format(name, data))

Посмотрим на результат этой программы:

Модуль самоанализа с инспектированием

Получение классов

Мы можем получить все классы, присутствующие в модуле, и предпринять действия, когда найдем класс, который искали:

import inspect import sample for key, data in inspect.getmembers(sample, inspect.isclass): print('<> : '.format(key, data))

Посмотрим на результат этой программы:

Изучение классов модулей с помощью inspect

Изучение методов класса

На этот раз мы пойдем дальше, исследуя методы, присутствующие в классе. Обратите внимание, что мы используем один и тот же метод getmembers, отличается только идентификатор свойства, то есть isfunction:

import inspect from pprint import pprint import sample pprint(inspect.getmembers(sample.X, inspect.isfunction))

Посмотрим на результат этой программы:

Изучение методов класса

Проверка объектов класса

С помощью модуля inspect можно отслеживать все экземпляры класса, созданные в программе, с помощью одного вызова функции:

import inspect from pprint import pprint import sample x = sample.X(name='inspect_getmembers') pprint(inspect.getmembers(x, inspect.ismethod))

Посмотрим на результат этой программы:

Проверка объектов класса

Получение строки документации для класса

Модуль inspect часто используется в инструментах Python, которые автоматизируют процесс извлечения классов и строк документации их методов, которые могут быть представлены конечным пользователям. Это означает, что разработчик может просто поместить строки документации в метод, и ту же строку можно использовать для представления другому разработчику приложения:

import inspect import sample print('X.__doc__:') print(sample.X.__doc__) print() print('getdoc(X):') print(inspect.getdoc(sample.X))

Пример inspect getdoc в python

Получение исходного кода класса

В интеллектуальных средах, таких как IDE, модуль inspect используется для представления исходного кода модулей, классов и функций:

import inspect import sample print(inspect.getsource(sample.Y))

Посмотрим на результат этой программы:

Получение исходного кода класса

Получение источника метода

На этот раз мы получаем исходный код только одного метода:

import inspect import sample print(inspect.getsource(sample.Y.get_name))

Посмотрим на результат этой программы:

Получение исходного кода метода

Получение подписи метода

В качестве последнего примера мы получим сигнатуру метода, который часто используется в Intellisense IDE, чтобы представить разработчикам, какие аргументы принимает метод:

import inspect import sample print(inspect.signature(sample.module_funct))

Посмотрим на результат этой программы:

Источник

Как найти все методы данного класса в Python?

Всем привет! В сегодняшней статье мы посмотрим, как мы можем найти все методы данного класса.

Как найти все методы данного класса в Python?

Всем привет! В сегодняшней статье мы посмотрим, как мы можем найти все методы данного класса.

Часто очень удобно перечислить все методы класса напрямую, чтобы мы могли выполнить некоторую предварительную обработку на основе определенных методов.

Давайте начнем! Мы покажем вам некоторые способы сделать это, и вы можете использовать любой из методов ниже.

Определите наш класс шаблона

Давайте сначала определим манекет, из которого мы можем проверить наши выходы.

Рассмотрим класс ниже, который имеет некоторые методы:

class MyClass(object): def __init__(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = a def add(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state + a return self.state def subtract(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state - a return self.state def multiply(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state * a return self.state def divide(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state / a return self.state

Класс хранит плавучую точку Государство Атрибут, который мы можем манипулировать с помощью арифметических операций.

Давайте теперь посмотрим на некоторые способы перечислять методы для нашего пользовательского класса.

Способ 1 – Использование функции DIR () для перечисления методов в классе

Чтобы перечислить методы этого класса, один подход – использовать функцию DIR () в Python.

dir () Функция вернет все функции и свойства класса.

Посмотрим, что произойдет, если мы попробуем это для MyClass Отказ

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'add', 'divide', 'multiply', 'subtract']

Хорошо, мы видим, что у нас есть наш Добавить , Разделить , вычесть и Умножьте Методы перечислены! Однако как насчет всех других методов?

Ну, эти методы (те, которые начинаются с двойного поднятия), называются Методы гуляния Отказ

Они обычно называются функцией обертки. Например, Dict () Функция вызывает __dict __ () метод.

Фильтрация расположенных методов от выхода

Обычно нам не понадобится префиксные методы двойной подчеркивания, поэтому мы можем отфильтровать их с помощью приведенного ниже фрагмента:

method_list = [method for method in dir(MyClass) if method.startswith('__') is False] print(method_list)
['add', 'divide', 'multiply', 'subtract']

Ух ты! Теперь мы только получаем арифметические методы, которые мы хотели!

Однако наше настоящее решение имеет проблему.

Помните, что dir () Вызывает как методы, так и свойства класса?

Обращение с свойствами класса

Если бы у нас была собственность внутри класса, он тоже будет перечислять. Рассмотрим ниже пример.

class MyClass(object): # MyClass property property1 = [1, 2, 3] def __init__(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = a def add(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state + a return self.state def subtract(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state - a return self.state def multiply(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state * a return self.state def divide(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state / a return self.state @staticmethod def global_method(a, b): return a + b @classmethod def myclass_method(cls): return cls method_list = [method for method in dir(MyClass) if method.startswith('_') is False] print(method_list)

Теперь, что вы думаете, что вывод будет?

['add', 'divide', 'global_method', 'multiply', 'myclass_method', 'property1', 'subtract']

Это дает нам Property1 Также, что не то, что мы хотим.

Нам нужно сделать еще один фильтр для дифференцировки между методом и свойством.

Но это действительно просто. Основное отличие состоит в том, что любой объект недвижимости Не Callable, в то время как методы можно назвать!

В Python мы можем использовать булевую функцию Callable (атрибут) Чтобы проверить, можно ли назвать атрибут.

Давайте теперь включаем это в наш старый код.

method_list = [attribute for attribute in dir(MyClass) if callable(getattr(MyClass, attribute)) and attribute.startswith('__') is False] print(method_list)

Давайте сломаемся, написав его без понимания списка:

method_list = [] # attribute is a string representing the attribute name for attribute in dir(MyClass): # Get the attribute value attribute_value = getattr(MyClass, attribute) # Check that it is callable if callable(attribute_value): # Filter all dunder (__ prefix) methods if attribute.startswith('__') == False: method_list.append(attribute) print(method_list)

Мы также изменили Метод к атрибут Так что это удаляет вводящее в заблуждение намерения!

Давайте проверим это сейчас.

['add', 'divide', 'global_method', 'multiply', 'myclass_method', 'subtract']

Действительно, мы действительно получим свой список методов без свойств!

Метод 2 – Использование OptParse.optionparter

Теперь это еще один подход, который вы можете использовать, если вы не слишком удобны с помощью dir () Отказ

Мы можем использовать проверять Модуль, чтобы перечислить методы.

А именно, мы можем использовать Inspect.getMembers (экземпляр,. Сизлет) получить список методов.

Это автоматически выполнит работу для вас, и вам просто нужно иметь дело с выходом. Давайте посмотрим на пример.

import inspect class MyClass(object): # MyClass property property1 = [1, 2, 3] def __init__(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = a def add(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state + a return self.state def subtract(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state - a return self.state def multiply(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state * a return self.state def divide(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state / a return self.state @staticmethod def global_method(a, b): return a + b @classmethod def myclass_method(cls): return cls # Create our instance instance = MyClass(100) # Get the list of functions method_list = inspect.getmembers(MyClass, predicate=inspect.ismethod) print(method_list)
[('__init__', >), ('add', >), ('divide', >), ('multiply', >), ('myclass_method', >), ('subtract', >)] 

Мы можем получить первый элемент каждого кортежа, чтобы получить имя метода.

Предостережения использования модуля проверки

Обратите внимание, что получаем список кортежей. Первый элемент кортежа – это имя функции, которую второй элемент представляет собой сам объект метода.

Хотя это может показаться хорошим решением, вы можете заметить некоторые вещи.

  • Для dir () Мы напрямую использовали саму название класса. Но здесь нам нужно пройти экземпляр.
  • StaticMethods также не отображаются в списке. В зависимости от вашего случая использования, вы можете/не понадобиться.

Из-за вышеупомянутых точек я бы предложил вам оставаться простой и использовать dir () Функция!

Заключение

В этой статье мы видели, как мы могли бы перечислить все методы данного класса в Python.

использованная литература

Читайте ещё по теме:

Источник

Оцените статью