Méně známé skutečnosti o Pythonu: objekt výpustka (... alias Ellipsis)

Od Petr Zemek, 2014-05-14

Python obsahuje řadu vestavěných objektů, které jsou unikátní. Mezi notoricky známé patří např. None, True či False. Jedním z těch méně známých je výpustka (angl. ellipsis), zapsaná jako tři tečky (...). V tomto příspěvku se dozvíte, o co jde a k čemu se tento objekt hodí.

Od Pythonu 3 je k dispozici vestavěný objekt zvaný výpustka (angl. ellipsis). Zapisuje se buď jako tři po sobě jdoucí tečky (...) nebo jménem (Ellipsis). Lze si jej vyzkoušet přímo v interpretu:

# $ python
# Python 3.4.0 (default, Apr 27 2014, 23:33:09)
>>> ...
Ellipsis
>>> Ellipsis
Ellipsis
>>> a = ...
>>> print(a)
Ellipsis
>>> ... is Ellipsis
True

V dokumentaci k Pythonu je zmíněn zde.

K čemu to je?

Vím o dvou případech, kdy se objekt výpustka používá.

Využití při tzv. slicingu

Jedná se o operaci získání určitých prvků ze seznamu/pole (angl. slicing). Určitě znáte něco takového:

>>> x = [0, 2, 4, 6, 8, 10]
>>> x[1:4]
[2, 4, 6]

Říkáme tím, že ze seznamu x chceme prvky na indexech 1 až 3 (hodnota druhého indexu mínus jedna). Objekt výpustky se při této operaci využívá např. v knihovně NumPy, což je knihovna pro matematické výpočty v Pythonu. Příklad použití (převzat odtud):

>>> import numpy
>>> z = numpy.arange(81).reshape(3, 3, 3, 3)
>>> z[1, ..., 2]
array([[29, 32, 35],
       [38, 41, 44],
       [47, 50, 53]])

Ony tři tečky znamenají, že se přeskočí všechny zbývající dimenze. Zjednodušuje to zápis. Detaily lze nalézt v dokumentaci.

Co je důležité poznamenat, tak při použití výpustky je nutné, aby to daný objekt podporoval. U standardního seznamu v Pythonu si s tím moc nepohrajete, protože nic takového nepodporuje.

Označení místa, kam by měl přijít kód

Když chcete v kódu znázornit místa, kam by měl v budoucnu přijít kód, můžete použít výpustku. Např.

def some_function():
    ...

Toto byste si u drtivé většiny jiných jazyků dovolit nemohli :). V Pythonu se ale jedná o korektní kód.

Jiná využití symbolu výpustky

Kromě výše uvedených použití objektu výpustka se lze v Pythonu setkat s použitím symbolu tří teček v jiném smyslu, kdy již nejde o objekt výpustka jako takový, ale spíše o použití tří teček v rámci grafického znázornění.

Očekávaný výstup u doctestu

Symbol tří teček lze využít při specifikování očekávaného výstupu při použití doctestu. Příklad:

#!/usr/bin/env python
 
def print_script():
    """Prints "Script: <script name> !".
 
    >>> print_script()
    Script: ... !
    """
    import sys
    print('Script:', sys.argv[0], '!')
 
if __name__ == '__main__':
    import doctest
    doctest.testmod(optionflags=doctest.ELLIPSIS)

Říkáme tím, že na místě tří teček se může objevit cokoliv. Detaily viz dokumentace k doctest.ELLIPSIS.

Tisk rekurzivních datových struktur na výstup

V Pythonu není problém vytvořit rekurzivní datovou strukturu. Např.

>>> x = [1, 2, 3]
>>> x.append(x)

Když se ji pak pokusíme vytisknout, dostaneme

>>> print(x)
[1, 2, 3, [...]]

Ony tři tečky jsou zde ve významu toho, že strukturu nelze vytisknout celou.

Pokud víte o dalších využitích tří teček v Pythonu, určitě se podělte v komentáři!

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
6 + 0 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.