Перечислите все модули, которые являются частью пакета Python?

Рассмотрим это, когда generateString делает много вещей для генерации строки из someParam:

Objects.requireNonNull(obj, generateString(someParam));

Аргументы оцениваются с нетерпением в Java, что означает, что generateString будет оценивается до вызова requireNonNull. Поэтому он вычисляется независимо от того, является ли obj нулевым или нет.

Вы можете исправить эту проблему, изменив ее следующим образом:

Objects.requireNonNull(obj, () -> generateString(someParam));

В этом случае вызов generateString будет вызван только в том случае, если obj на самом деле было нулевым. Это более эффективно, когда generateString дороже, чем создание Supplier -объекта.

Вы должны просто использовать обычный не лямбда-метод, если ваш параметр String является просто литералом, например:

Objects.requireNonNull(obj, "obj was null!");
96
задан CharlesB 25 February 2013 в 15:18
поделиться

4 ответа

Да, вам нужно что-то на основе pkgutil или аналогичного - таким образом вы можете обращаться со всеми пакетами одинаково, независимо от того, находятся ли они в яйцах или zip-файлах (где os. listdir не поможет).

import pkgutil

# this is the package we are inspecting -- for example 'email' from stdlib
import email

package = email
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
    print "Found submodule %s (is a package: %s)" % (modname, ispkg)

Как их тоже импортировать? Вы можете просто использовать __ import __ как обычно:

import pkgutil

# this is the package we are inspecting -- for example 'email' from stdlib
import email

package = email
prefix = package.__name__ + "."
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix):
    print "Found submodule %s (is a package: %s)" % (modname, ispkg)
    module = __import__(modname, fromlist="dummy")
    print "Imported", module
136
ответ дан 24 November 2019 в 05:38
поделиться

Я искал способ перезагрузить все подмодули, которые я редактирую живой в моем пакете. Это - комбинация ответов/комментариев выше, таким образом, я решил отправить его здесь как ответ, а не комментарий.

package=yourPackageName
import importlib
import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__, prefix=package.__name__+'.', onerror=lambda x: None):
    try:
        modulesource = importlib.import_module(modname)
        reload(modulesource)
        print("reloaded: {}".format(modname))
    except Exception as e:
        print('Could not load {} {}'.format(modname, e))
0
ответ дан 24 November 2019 в 05:38
поделиться

The right tool for this job is pkgutil.walk_packages.

To list all the modules on your system:

import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None):
    print(modname)

Be aware that walk_packages imports all subpackages, but not submodules.

If you wish to list all submodules of a certain package then you can use something like this:

import pkgutil
import scipy
package=scipy
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__,
                                                      prefix=package.__name__+'.',
                                                      onerror=lambda x: None):
    print(modname)

iter_modules only lists the modules which are one-level deep. walk_packages gets all the submodules. In the case of scipy, for example, walk_packages returns

scipy.stats.stats

while iter_modules only returns

scipy.stats

The documentation on pkgutil (http://docs.python.org/library/pkgutil.html) does not list all the interesting functions defined in /usr/lib/python2.6/pkgutil.py.

Perhaps this means the functions are not part of the "public" interface and are subject to change.

However, at least as of Python 2.6 (and perhaps earlier versions?) pkgutil comes with a walk_packages method which recursively walks through all the modules available.

45
ответ дан 24 November 2019 в 05:38
поделиться

Вот один способ, из моей головы:

>>> import os
>>> filter(lambda i: type(i) == type(os), [getattr(os, j) for j in dir(os)])
[<module 'UserDict' from '/usr/lib/python2.5/UserDict.pyc'>, <module 'copy_reg' from '/usr/lib/python2.5/copy_reg.pyc'>, <module 'errno' (built-in)>, <module 'posixpath' from '/usr/lib/python2.5/posixpath.pyc'>, <module 'sys' (built-in)>]

Это, безусловно, можно очистить и улучшить .

РЕДАКТИРОВАТЬ: Вот немного лучшая версия:

>>> [m[1] for m in filter(lambda a: type(a[1]) == type(os), os.__dict__.items())]
[<module 'copy_reg' from '/usr/lib/python2.5/copy_reg.pyc'>, <module 'UserDict' from '/usr/lib/python2.5/UserDict.pyc'>, <module 'posixpath' from '/usr/lib/python2.5/posixpath.pyc'>, <module 'errno' (built-in)>, <module 'sys' (built-in)>]
>>> [m[0] for m in filter(lambda a: type(a[1]) == type(os), os.__dict__.items())]
['_copy_reg', 'UserDict', 'path', 'errno', 'sys']

ПРИМЕЧАНИЕ: Это также обнаружит модули, которые не обязательно могут быть расположены в подкаталоге пакета, если они втянуты в его __ init __. Py , поэтому это зависит от того, что вы подразумеваете под «частью» пакета.

-4
ответ дан 24 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: