Что делает & ldquo; feats [& hellip ;,:: 2] & rdquo; означает в python3? [Дубликат]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

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

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа прекращает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

355
задан Ashwini Chaudhary 25 February 2014 в 16:12
поделиться

10 ответов

Его предполагаемое использование должно быть не только для этих сторонних модулей. Он не упоминается должным образом в документации Python (или, может быть, я просто не мог этого найти), но эллипсис ... фактически используется в CPython по крайней мере в одном месте.

Он используется для представления бесконечных структур данных в Python. Я столкнулся с этой нотой, играя со списками.

Для получения дополнительной информации см. этот вопрос .

386
ответ дан Community 18 August 2018 в 16:48
поделиться
  • 1
    Различные вещи. Этот вопрос задает вопрос о встроенном типе ellipsis и объекте Ellipsis. Представление бесконечных структур данных с эллипсами чисто для отображения, не имеющее никакого отношения к объекту ellipsis или Ellipsis. – chys 27 February 2014 в 08:34
  • 2
    @chys На самом деле, это происходит небольшим образом - строки Python __repr__ нацелены на то, чтобы быть допустимыми выражениями Python - если бы не эллипсис, существующий на языке, как он есть, представление не было бы допустимым выражением. – Gareth Latty 1 August 2014 в 16:44
  • 3
    @Lattyware Ну, это правда, что оригинальный дизайн так намеревается. Он также намерен eval(repr(a)) стремиться быть равным a. К сожалению, время от времени оно ложно, даже для встроенных типов. Попробуйте это: a=[]; a.append(a); eval(repr(a)). repr(a) является [[...]], недействительным выражением в Python 2. (В Python 3 он действителен, но результат eval - это нечто иное, все еще противоречащее первоначальному намерению.) – chys 4 August 2014 в 06:07
  • 4
    Бах. Вы используете Ellipsis неправильно. Очевидно, вы должны использовать его так: a[Ellipsis,0], ни один из этих глупых .... – ArtOfWarfare 22 February 2015 в 14:35
  • 5
    он также используется в типе PEP484 в файлах-заглушках – noɥʇʎԀʎzɐɹƆ 14 July 2016 в 20:01
389
ответ дан Community 7 September 2018 в 01:39
поделиться
403
ответ дан Community 30 October 2018 в 05:54
поделиться

Вы также можете использовать Ellipsis при указании ожидаемого выхода doctest :

class MyClass(object):
    """Example of a doctest Ellipsis

    >>> thing = MyClass()
    >>> # Match <class '__main__.MyClass'> and <class '%(module).MyClass'>
    >>> type(thing)           # doctest:+ELLIPSIS
    <class '....MyClass'>
    """
    pass
39
ответ дан Chiggs 18 August 2018 в 16:48
поделиться
  • 1
    Но действительно ли это включает объект Ellipsis? Разве это не просто особенность парсера / помощника доктрины? – akaihola 21 January 2017 в 06:53
  • 2
    @akaihola Я бы сказал, что это так, как описано в doctest.ELLIPSIS . Я ожидаю, что большинство, если не все использование ... являются синтаксическими, и не use действительный объект Ellipsis. Разве это не просто удобное имя для адаптируемой концепции? – nealmcb 21 April 2017 в 12:57

__getitem__ минимальные примеры

Служит как одномерное магическое значение класса, которое передается в __getitem__, когда вы используете синтаксис «магия» ....

Пример:

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)

# Ellipsis notation generates an Ellipsis class object.
assert C()[...] == Ellipsis

. Встроенный класс list Python решает дать ему семантику диапазона и любое разумное использование этого тоже должно быть конечно.

Лично я бы просто держался подальше от него в своих API-интерфейсах и вместо этого создавал отдельный более явный метод.

4
ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 18 August 2018 в 16:48
поделиться

Как упоминалось @ noɥʇʎԀʎzɐɹƆ и @phoenix - вы действительно можете использовать его в файлах-заглушках. например

class Foo: bar: Any = ... def __init__(self, name: str=...) -> None: ...

Более подробную информацию и примеры использования этого эллипса можно найти здесь https://www.python.org/dev/peps/pep- 0484 / # заглушки-файлы

0
ответ дан henryJack 18 August 2018 в 16:48
поделиться

Подводя итог тому, что говорили другие, с Python 3, Ellipsis по существу является другой синглтонной константой, подобной None, но без конкретного предполагаемого использования. Существующие применения включают в себя:

  • В синтаксисе среза для представления полного фрагмента в остальных измерениях
  • В типе намека на указание только части типа (Callable[..., int] или Tuple[str, ...] )
  • В типах файлов-заглушек указывается, что есть значение по умолчанию без указания его

Возможные применения могут включать:

  • Как значение по умолчанию для мест, где None является допустимым параметром
  • В качестве содержимого для функции, которую вы еще не реализовали
1
ответ дан Matthew D. Scholefield 18 August 2018 в 16:48
поделиться

Как и для Python 3.5 и PEP484 , буквальный эллипс используется для обозначения определенных типов для проверки статического типа при использовании модуля typing .

Пример 1:

Однородные кортежи произвольной длины могут быть выражены с использованием одного типа и эллипсиса, например Tuple[int, ...]

Пример 2:

Можно объявить возвращаемый тип вызываемого без указания сигнатуры вызова, заменив литеральный многоточие (три точки) для списка аргументов:

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body
29
ответ дан phoenix 18 August 2018 в 16:48
поделиться

Из документации Python :

Этот объект используется расширенной записью среза (см. справочное руководство Python ). Он не поддерживает никаких специальных операций. Существует ровно один многоточий объект с именем Ellipsis (встроенное имя).

29
ответ дан Simon Lieschke 18 August 2018 в 16:48
поделиться

В Python 3 вы можете использовать литерал Ellipsis ... как «nop» placeholder для кода:

def will_do_something():
    ...

Это не волшебство; любое выражение может быть использовано вместо ..., например:

def will_do_something():
    1

(Нельзя использовать слово «санкционированное», но могу сказать, что это использование было не отвергнуто открыто от Guido.)

127
ответ дан tzot 18 August 2018 в 16:48
поделиться
  • 1
    В полугодовом соглашении я часто вижу, что ... используется там, где люди хотят указать то, что они намерены заполнить позже («todo» пустой блок), а pass означает блок, который не имеет никакого кода. – Gareth Latty 16 April 2012 в 02:04
  • 2
    Python также имеет литерал NotImplemented, который полезен, когда вы хотите, чтобы ваша неполная функция возвращала что-то значимое (вместо None, как в вашем примере). (Еще одна утилита: Выполнение арифметических операций ) – zvyn 26 June 2015 в 05:19
  • 3
    @zvyn Это не литерал. Это просто имя. Например, NotImplemented = 'something_else' является допустимым python, но ... = 'something_else' является синтаксической ошибкой. – wim 13 April 2016 в 17:51
  • 4
    @wim: действительно, и я подумал, что Python 3, наконец, избавился от тех встроенных имен, которые не являются литерами или вызывающими. – zvyn 14 April 2016 в 01:42
  • 5
    @zvyn Что делать, если при импорте этого модуля возникло исключение? :) – pizzapants184 24 April 2017 в 01:15
Другие вопросы по тегам:

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