Все члены пакета / модуля определяет? - PullRequest
1 голос
/ 13 января 2010

Как я могу узнать, какие члены определяет модуль / пакет?Под определением я имею в виду:

somemodule.py

import os # <-- Not defined in this module
from os.path import sep # <-- Not defined in this module

I_AM_ATTRIBUTE = None # <-- Is defined in this module

class SomeClass(object): # <-- Is defined also...
    pass

Поэтому мне нужна какая-то функция, которая при вызове выдаст только I_AM_ATTRIBUTE и SomeClass.

Теперь я пытался использовать dir(somemodule), но как я могу узнать, какие из них определены в somemodule?Проверка на __module__ не работает, поскольку она не определена в модулях и атрибутах (таких как os package или sep attribute).

Видимо, дикий импорт (from somemodule import *) также не можетотфильтровать их, так что это вообще возможно?

Лучшее, что я могу получить:

import somemodule

for name in dir(somemodule):
    try:
        value = getattr(somemodule, name)
    except:
        pass
    else:
        if hasattr(value, "__module__"):
            if value.__module__ != somemodule.__name__:
                continue
        if hasattr(value, "__name__"):
            if not value.__name__.startswith(__name__):
                continue
        print "somemodule defines:", name

Берет os, но оставляет sep.

Ответы [ 2 ]

1 голос
/ 13 января 2010

Что значит «определить»? Для меня определено означает, что какой-то символ является частью открытого интерфейса модуля. Это соответствует тому, как вы пытаетесь использовать этот термин, в том числе в своем примере, но если у вас есть какая-то цель, которая не соответствует этому определению, вам придется уточнить вопрос о том, что вы на самом деле пытаюсь сделать. Это делает проблемой документации .

Таким образом, вы не можете знать, что определяет модуль, и некоторые вещи, которые импортируются, могут все еще быть «определены в этом модуле» или «определены как часть открытого интерфейса этого модуля». Это часто происходит при импорте из частного модуля, включая модули расширения C.

Для своих собственных модулей используйте __ all __ (может сделать это легко ) или неформальный префикс подчеркивания для непубличных (например, _private_var = 42). Оба соглашения распознаются функцией help () и должны использоваться другими генераторами документации.

1 голос
/ 13 января 2010

Нет способа сделать это. Это потому, что простые атрибуты (например, I_AM_ATTRIBUTE в вашем примере) - это просто значения, хранящиеся в словаре модуля. Когда они копируются в другой модуль, они также помещаются в словарь этого модуля, и невозможно определить, какое место было изначально. Вы можете говорить только с объектами, которые предоставляют атрибут __module__, такими как классы и функции.

Что касается wild import, при запуске from somemodule import * в вашем примере будут импортированы все атрибуты, включая os и sep. Если пакет предоставляет переменную __all__, wild import импортирует содержащиеся в ней имена. В противном случае будут импортированы все имена, не начинающиеся с подчеркивания, независимо от того, из какого модуля они изначально.

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