2

関数が呼び出されたモジュールのパッケージの名前を返す関数が必要です。モジュールの名前を取得するのは簡単です:

import inspect

module_name = inspect.currentframe().f_back.f_globals['__name__']

また、モジュールのパッケージを取得するために最後の部分を削除するのも簡単です。

package_name = '.'.join(module_name.split('.')[:-1])

ただし、関数がパッケージの から呼び出される場合、__init__.py名前の最後の部分を削除しないでください。たとえば、から呼び出された場合foo/bar/__init__.pymodule_name上記の例'foo.bar'では、すでにパッケージの名前である に設定されます。

モジュール名またはモジュールオブジェクトから、パッケージまたはモジュールを参照しているかどうかを確認するにはどうすればよいですか?

私が見つけた最良の方法は、モジュール オブジェクトの属性が存在する場合はそれを取得し、名前に拡張子が付加__file__されたファイルを指しているかどうかを確認することです。__init__しかし、これは私には非常にもろいようです。

4

2 に答える 2

1

Python の組み込みインポート ロジックのほとんどを再実装するimportlib.__import__()必要があり、相対インポートをサポートするモジュールのパッケージを見つける必要があります。

# __package__ is not guaranteed to be defined or could be set to None
# to represent that it's proper value is unknown
package = globals.get('__package__')
if package is None:
    package = globals['__name__']
    if '__path__' not in globals:
        package = package.rpartition('.')[0]
module = _gcd_import(name, package, level)

そのため、モジュールのパッケージを取得するための信頼できる「直接的な」方法はないようです。

于 2013-10-14T09:51:11.080 に答える
1

モジュールオブジェクトから:

module.__package__

は、私が調べたカップルで利用でき、正しいようです。ただし、必要なものが正確に得られない場合があります。

import os.path
import httplib2
import xml.etree.ElementTree as etree

os.path.__package__
<blank... this is a builtin>
httplib2.__package__
'httplib2'
etree.__package__
'xml.etree'

あなたが使用することができます

function.__module__

また、実際のモジュールではなく、モジュール名が表示されます-ローカル変数に再度インポートするよりもモジュールオブジェクト自体を取得する簡単な方法があるかどうかはわかりません。

etree.parse.__module__
'xml.etree.ElementTree'

os.path.split.__module__
'ntpath'

良いことは、物事の実際の場所に従って、これがより正確であるように見えることです。

httplib2.Response.__module__
'httplib2'
httplib2.copy.copy.__module__
'copy'
httplib2.urlparse.ParseResult.__module__
'urlparse'

于 2013-10-08T12:54:19.103 に答える