В Twisted есть # 2 в виде twisted / python / refle.py.Вам нужно что-то подобное для создания системы конфигурации на основе строк, например, с конфигурацией Django urls.py.
Посмотрите код и журнал контроля версий, чтобы увидеть, что они должны были сделать, чтобы она работала- и не получится!- правильный путь.
Другие вещи, которые вы ищете, накладывают достаточно ограничений на среду Python, чтобы не было такого понятия, как решение общего назначения.
Вот кое-что, что в некоторой степени реализует ваш #1
>>> import pickle
>>> def identify(f):
... name = f.__name__
... module_name = pickle.whichmodule(f, name)
... return module_name + "." + name
...
>>> identify(math.cos)
'math.cos'
>>> from xml.sax.saxutils import handler
>>> identify(handler)
'__main__.xml.sax.handler'
>>>
Ваш # 3 недостаточно определен.Если я сделаю
__builtin__.step = path.to.your.stap
, то должен ли код поиска найти его как "шаг"?
Самая простая реализация, о которой я могу подумать, - это просто поиск во всех модулях и поиск элементов верхнего уровня, которыеименно то, что вы хотите
>>> import sys
>>> def _find_paths(x):
... for module_name, module in sys.modules.items():
... if module is None:
... continue
... for (member_name, obj) in module.__dict__.items():
... if obj is x:
... yield module_name + "." + member_name
...
>>> def find_shortest_name_to_object(x):
... return min( (len(name), name) for name in _find_paths(x) )[1]
...
>>> find_shortest_name_to_object(handler)
'__builtin__._'
>>> 5
5
>>> find_shortest_name_to_object(handler)
'xml.sax.handler'
>>>
Здесь вы можете видеть, что «обработчик» фактически был в _ из предыдущего выражения, что делает его самым коротким именем.
Если вы хотите что-то еще, напримеррекурсивный поиск всех членов всех модулей, а затем просто его кодирование.Но, как показывает пример "_", будут сюрпризы.Кроме того, это нестабильно, поскольку импорт другого модуля может сделать доступным и более коротким путь к другому объекту.
Вот почему люди снова и снова говорят, что то, что вы хотите, на самом деле ни к чему не полезно, и поэтомудля него нет модулей.
А что касается вашего # 4, как в мире будет какой-либо общий пакет, удовлетворяющий этим потребностям в именовании?
В любом случае, вы написали
Пожалуйста, не пытайтесь показать мне быструю реализацию этих вещей.Это сложнее, чем кажется, есть много ошибок, и любой быстрый-грязный код, вероятно, потерпит неудачу во многих важных случаях.Такие задачи требуют проверенного в бою кода.
, поэтому не думайте о моих примерах как о решениях, а как о том, почему то, о чем вы просите, не имеет большого смысла.Это такое хрупкое пространство для решения, и у немногих, кто рискует там (в основном из любопытства), возникают такие разные проблемы, что одноразовое индивидуальное решение - лучшее.Модуль для большинства из них не имеет смысла, и если бы он имел смысл, объяснение того, что делает модуль, вероятно, было бы длиннее, чем код.
И, следовательно, ответ на ваш вопрос «нет, естьтаких модулей нет. "
Что делает ваш вопрос еще более запутанным, так это то, что реализация Python на C уже определяет" адрес объекта ". документы для id () говорят:
Подробности реализации CPython: Это адрес объекта.
Что вы ищетеэто имя или путь к объекту.Не "адрес объекта Python".