Найти функции, явно определенные в модуле (python)

Хорошо, я знаю, что вы можете использовать метод dir () для отображения всего в модуле, но есть ли способ увидеть только те функции, которые определены в этом модуле? Например, предположим, что мой модуль выглядит так:

from datetime import date, datetime

def test():
    return "This is a real method"

Даже если я использую inspect () для фильтрации встроенных функций, у меня все равно останется все, что было импортировано. Например, я увижу:

[«дата», «дата и время», «тест»]

Есть ли способ исключить импорт? Или другой способ узнать, что определено в модуле?

 Miles10 июл. 2009 г., 02:06
В Python «метод» обычно используется только для ссылки на функции, которые являются атрибутами класса. Вашtest() лучше называть «функцией».
 S.Lott10 июл. 2009 г., 01:14
Что не так с чтением источника?

Ответы на вопрос(5)

осмотреть модуль, вероятно, то, что вы ищете здесь.

import inspect
if inspect.ismethod(methodInQuestion):
    pass # It's a method
 10 июл. 2009 г., 01:22
Я комментирую этот пост, потому что моему представителю меньше 50 лет.module атрибут тоже.
 Cory10 июл. 2009 г., 01:00
Я попробовал это - осмотреть все еще возвращает импортированные методы
 10 июл. 2009 г., 01:02
Похоже, это будет работать в сочетании с ответом Стефано. Вы можете видеть, что является методом и что импортируется.

Ты можешь проверить__module__ атрибут рассматриваемой функции. Я говорю «функция» потому что метод обычно принадлежит классу ;-).

Кстати, класс на самом деле также имеет__module__ приписывать.

Решение Вопроса

Вы ищете что-то подобное?

import sys, inspect

def is_mod_function(mod, func):
    return inspect.isfunction(func) and inspect.getmodule(func) == mod

def list_functions(mod):
    return [func.__name__ for func in mod.__dict__.itervalues() 
            if is_mod_function(mod, func)]


print 'functions in current module:\n', list_functions(sys.modules[__name__])
print 'functions in inspect module:\n', list_functions(inspect)

РЕДАКТИРОВАТЬ: измененные имена переменных из «мета»; в 'func' чтобы избежать путаницы (здесь мы имеем дело с функциями, а не методами).

 20 сент. 2018 г., 19:01
Это работает с декорированными функциями.
 21 авг. 2014 г., 00:43
Неважно, что будет включать в себя импортированные функции, все еще нужноgetmodule(func) == mod для того, чтобы он работал, но все еще один лайнер.
 21 мая 2014 г., 14:52
К сожалению, это не будет работать для украшенных функций.
 21 авг. 2014 г., 00:37
@ars Не могу просто заменить свои функции на[f[1] for f in inspect.getmembers(mod) if inspect.isfunction(f[1])] и получить те же результаты?
 21 июл. 2015 г., 18:27
Есть ли способ заставить это работать с декорированными функциями?

Каждый класс в Python имеет__module__ приписывать. Вы можете использовать его значение для выполнения фильтрации. Взгляни например 6.14 в погружении в питона

 Cory10 июл. 2009 г., 01:08
но это не класс, это просто некоторые методы, определенные в модуле ...
 10 июл. 2009 г., 02:03
Функции имеют__module__ атрибут тоже.

Как насчет следующего:

grep ^def my_module.py
 Cory10 июл. 2009 г., 01:02
хаха, должен быть лучший способ, правда?
 10 июл. 2009 г., 01:11
Это быстрое и грязное решение, которое работает. Возможно, это не лучшее решение вашей проблемы, но я не знаю, потому что я не знаю, какую проблему вы пытаетесь решить.
 10 июл. 2009 г., 05:07
+1: просто прочитайте источник.

Ваш ответ на вопрос