Рассмотрим это, когда 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!");
Да, вам нужно что-то на основе 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
Я искал способ перезагрузить все подмодули, которые я редактирую живой в моем пакете. Это - комбинация ответов/комментариев выше, таким образом, я решил отправить его здесь как ответ, а не комментарий.
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))
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.
Вот один способ, из моей головы:
>>> 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
, поэтому это зависит от того, что вы подразумеваете под «частью» пакета.