Чтение Декларации моей собственной Банки

Для производительности особенно то, когда Вы выполняете итерации по большому спектру, xrange(), обычно лучше. Однако существует все еще несколько случаев, почему Вы могли бы предпочесть range():

  • В python 3, range() делает то, что xrange() раньше делал, и xrange() не существует. Если Вы хотите написать код, который будет работать и на Python 2 и на Python 3, Вы не можете использовать xrange().

  • range() может на самом деле быть быстрее в некоторых случаях - например, при итерации по той же последовательности многократно. xrange() должен восстановить целочисленный объект, что каждый раз, но range() будет иметь реальные целочисленные объекты. (Это будет всегда работать хуже с точки зрения памяти однако)

  • xrange(), не применимо во всех случаях, где реальный список необходим. Например, это не поддерживает части или любые методы списка.

[Редактирование] Там несколько сообщений, упоминающих, как range() будет обновлен 2to3 инструмент. Для записи вот вывод выполнения инструмента на некоторых демонстрационных использованиях [1 112] и xrange()

RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: ws_comma
--- range_test.py (original)
+++ range_test.py (refactored)
@@ -1,7 +1,7 @@

 for x in range(20):
-    a=range(20)
+    a=list(range(20))
     b=list(range(20))
     c=[x for x in range(20)]
     d=(x for x in range(20))
-    e=xrange(20)
+    e=range(20)

, Как Вы видите при использовании в для цикла или понимания, или, где уже перенесено со списком (), диапазон оставлен без изменений.

124
задан Alba Mendez 20 April 2011 в 08:07
поделиться

4 ответа

Вы можете сделать одно из двух:

  1. Вызвать getResources () и просмотреть возвращенную коллекцию URL-адресов, считывая их как манифесты, пока не найдете свой:

     Перечисление  resources = getClass (). GetClassLoader ()
     .getResources ("МЕТА-ИНФОРМАЦИЯ / МАНИФЕСТ.MF");
    while (resources.hasMoreElements ()) {
     пытаться {
     Манифест манифеста = новый манифест (resources.nextElement (). OpenStream ());
     // проверяем, что это ваш манифест, и делаем то, что вам нужно, или получаем следующий
     ...
     } catch (IOException E) {
     // ручка
     }
    }
    
  2. Вы можете попробовать проверить, является ли getClass (). GetClassLoader () экземпляром java.net.URLClassLoader . Это большинство загрузчиков классов Sun, включая AppletClassLoader . Затем вы можете преобразовать его и вызвать findResource () , который был известен - по крайней мере, для апплетов - для непосредственного возврата необходимого манифеста:

     URLClassLoader cl = (URLClassLoader) getClass (). GetClassLoader () ;
    пытаться {
     URL url = cl.findResource ("META-INF / MANIFEST.MF");
     Манифест манифеста = новый манифест (url.openStream ());
     // что-то с этим делать
     ...
    } catch (IOException E) {
     // ручка
    }
    
110
ответ дан 24 November 2019 в 01:05
поделиться

Сначала вы можете найти URL-адрес вашего класса. Если это JAR, вы загружаете манифест оттуда. Например,

Class clazz = MyClass.class;
String className = clazz.getSimpleName() + ".class";
String classPath = clazz.getResource(className).toString();
if (!classPath.startsWith("jar")) {
  // Class not from JAR
  return;
}
String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + 
    "/META-INF/MANIFEST.MF";
Manifest manifest = new Manifest(new URL(manifestPath).openStream());
Attributes attr = manifest.getMainAttributes();
String value = attr.getValue("Manifest-Version");
116
ответ дан 24 November 2019 в 01:05
поделиться

Я считаю, что наиболее подходящий способ получить манифест для любого пакета (включая пакет, который загрузил данный класс) - использовать объект Bundle или BundleContext.

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

Почему вы включаете шаг getClassLoader? Если вы скажете this.getClass (). GetResource (), вы должны получать ресурсы относительно вызывающего класса. Я никогда не использовал ClassLoader.getResource (), хотя при беглом просмотре документации Java кажется, что вы получите первый ресурс с таким именем, найденный в любом текущем пути к классам.

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

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