Такая операция должна быть возможной с Java 8 Stream
, но она не обязательно может быть выполнена эффективно - например, вы не можете распараллеливать такую операцию, как вы должны смотреть на элементы по порядку.
API не обеспечивает простой способ сделать это, но, пожалуй, самый простой способ - взять Stream.iterator()
, обернуть Iterator
, чтобы иметь «take-while», а затем вернитесь к Spliterator
, а затем к Stream
. Или, может быть, оберните Spliterator
, хотя в этой реализации он больше не может быть разделен.
Вот непроверенная реализация takeWhile
на Spliterator
:
static <T> Spliterator<T> takeWhile(
Spliterator<T> splitr, Predicate<? super T> predicate) {
return new Spliterators.AbstractSpliterator<T>(splitr.estimateSize(), 0) {
boolean stillGoing = true;
@Override public boolean tryAdvance(Consumer<? super T> consumer) {
if (stillGoing) {
boolean hadNext = splitr.tryAdvance(elem -> {
if (predicate.test(elem)) {
consumer.accept(elem);
} else {
stillGoing = false;
}
});
return hadNext && stillGoing;
}
return false;
}
};
}
static <T> Stream<T> takeWhile(Stream<T> stream, Predicate<? super T> predicate) {
return StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false);
}
' lib/
родительский каталог должен быть в sys.path
.
Ваш' lib/__init__.py
' мог бы быть похожим на это:
from . import settings # or just 'import settings' on old Python versions
class Helper(object):
pass
Тогда следующий пример должен работать:
from lib.settings import Values
from lib import Helper
__init__.py
определяет, как Ваш пакет смотрит снаружи. Если необходимо использовать Helper
в [1 110], тогда определяют Helper
в другом файле, например, 'lib/helper.py
'.
. | `-- import_submodule.py `-- lib |-- __init__.py |-- foo | |-- __init__.py | `-- someobject.py |-- helper.py `-- settings.py 2 directories, 6 files
команда:
$ python import_submodule.py
Вывод:
settings
helper
Helper in lib.settings
someobject
Helper in lib.foo.someobject
# ./import_submodule.py
import fnmatch, os
from lib.settings import Values
from lib import Helper
print
for root, dirs, files in os.walk('.'):
for f in fnmatch.filter(files, '*.py'):
print "# %s/%s" % (os.path.basename(root), f)
print open(os.path.join(root, f)).read()
print
# lib/helper.py
print 'helper'
class Helper(object):
def __init__(self, module_name):
print "Helper in", module_name
# lib/settings.py
print "settings"
import helper
class Values(object):
pass
helper.Helper(__name__)
# lib/__init__.py
#from __future__ import absolute_import
import settings, foo.someobject, helper
Helper = helper.Helper
# foo/someobject.py
print "someobject"
from .. import helper
helper.Helper(__name__)
# foo/__init__.py
import someobject
Вы просто вставляете их __ init __. py.
Так с test/classes.py тем, чтобы быть:
class A(object): pass
class B(object): pass
... и тест / __ init __. py быть:
from classes import *
class Helper(object): pass
можно импортировать тест и иметь доступ к A, B и Помощнику
>>> import test
>>> test.A
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>
Да, это возможно. Вы могли бы также хотеть определить __all__
в __init__.py
файлы. Это - список модулей, которые будут импортированы, когда Вы сделаете
from lib import *
Редактирование, так как я неправильно понял вопрос:
Просто помещает Helper
класс в __init__.py
. Это отлично pythonic. Это просто чувствует себя странным, прибывая из языков как Java.