Python __ импорт __ не работает как ожидалось

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

43
задан CharlesB 25 February 2013 в 15:08
поделиться

2 ответа

Из документов Python о __import__:

__import__( name[, globals[, locals[, fromlist[, level]]]])

...

, Когда переменная имени имеет форму package.module, обычно, пакет верхнего уровня (имя до первой точки) возвращается, не модуль, названный по имени. Однако, когда непустой fromlist аргумент дан, модуль, названный по имени, возвращается. Это сделано для совместимости с байт-кодом, сгенерированным для различных видов оператора импорта; при использовании "импорта spam.ham.eggs", спам пакета верхнего уровня должен быть помещен в пространство имен импорта, но при использовании "от яиц импорта spam.ham", spam.ham подпакет должен использоваться для нахождения переменной яиц. Как обходное решение для этого поведения, используйте getattr () для извлечения желаемых компонентов. Например, Вы могли определить следующего помощника:

def my_import(name):
    mod = __import__(name)
    components = name.split('.')
    for comp in components[1:]:
        mod = getattr(mod, comp)
    return mod

Для перефразирования:

, Когда Вы просите somepackage.somemodule, __import__ возвраты somepackage.__init__.py, который часто пуст.

Это возвратится somemodule, если Вы обеспечите fromlist (список имен переменной в somemodule, Вы хотите, которые на самом деле не возвращаются)

, Вы можете также, как я сделал, используйте функцию, которую они предлагают.

Примечание: Я задал этот вопрос, полностью намереваясь ответить на него сам. Была важная персона в моем коде, и неправильно диагностировавший его, мне потребовалось долгое время для понимания его, таким образом, я полагал, что помогу ТАК сообщество и отправлю глюк, с которым я столкнулся здесь.

54
ответ дан dwestbrook 26 November 2019 в 22:37
поделиться

Существует что-то, что работает, поскольку Вы хотите его к: twisted.python.reflect.namedAny:

>>> from twisted.python.reflect import namedAny
>>> namedAny("operator.eq")
<built-in function eq>
>>> namedAny("pysqlite2.dbapi2.connect")
<built-in function connect>
>>> namedAny("os")
<module 'os' from '/usr/lib/python2.5/os.pyc'>
7
ответ дан Glyph 26 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

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