Wat doet het Ellipsis-object?

Terwijl ik doelloos door de naamruimte surfte, zag ik een vreemd uitziend object genaamd Ellipsis, het lijkt niets bijzonders te zijn of te doen, maar het is een wereldwijd beschikbare ingebouwde functie.

Na een zoektocht ontdekte ik dat het wordt gebruikt in een obscure variant van de slicing-syntaxis door Numpy en Scipy… maar bijna niets anders.

Is dit object speciaal aan de taal toegevoegd om Numpy + Scipy te ondersteunen? Heeft Ellipsis een algemene betekenis of gebruik?

D:\workspace\numpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis

Antwoord 1, autoriteit 100%

Dit kwam onlangs naar voren in een andere vraag. Van daaruit zal ik mijn antwoorduitwerken:

Ellipsisis een object dat in plaknotatie kan verschijnen. Bijvoorbeeld:

myList[1:2, ..., 0]

De interpretatie ervan hangt puur af van wat de functie __getitem__implementeert en ziet daar Ellipsis-objecten, maar het belangrijkste (en beoogde) gebruik is in de numpybibliotheek van derden, die een multidimensionaal arraytype toevoegt. Aangezien er meer dan één dimensie is, wordt slicen complexer dan alleen een start- en stopindex; het is handig om ook in meerdere dimensies te kunnen snijden. Bijvoorbeeld, gegeven een 4×4 array, zou het gebied linksboven worden gedefinieerd door het segment [:2,:2]:

>>> a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])
>>> a[:2,:2]  # top left
array([[1, 2],
       [5, 6]])

Om dit verder uit te breiden, wordt Ellipsis hier gebruikt om een ​​tijdelijke aanduiding aan te geven voor de rest van de niet gespecificeerde matrixafmetingen. Zie het als een aanduiding van het volledige segment [:]voor alle dimensies in de opening die het is geplaatst, dus voor een 3D-array, a[...,0]is hetzelfde als a[:,:,0]en voor 4d, a[:,:,:,0], op dezelfde manier, a[0,...,0]is a[0,:,:,0](met hoeveel dubbele punten in het midden ook het volledige aantal dimensies in de array vormen).

Interessant is dat in python3 de letterlijke Ellipsis (...) buiten de slice-syntaxis kan worden gebruikt, dus je kunt het volgende schrijven:

>>> ...
Ellipsis

Behalve de verschillende numerieke typen, nee, ik denk niet dat het wordt gebruikt. Voor zover ik weet, is het puur voor numpy-gebruik toegevoegd en heeft het geen andere kernondersteuning dan het leveren van het object en de bijbehorende syntaxis. Het object dat daar was, vereiste dit niet, maar de letterlijke “…”-ondersteuning voor segmenten wel.


Antwoord 2, autoriteit 42%

In Python 3, kunt u? gebruik de Ellipsis letterlijke ...als een nop tijdelijke aanduiding voor code die nog niet is geschreven:

def will_do_something():
    ...

Dit is geenmagie; elke uitdrukking kan worden gebruikt in plaats van ..., bijvoorbeeld:

def will_do_something():
    1

(Kan het woord sanctioned niet gebruiken, maar ik kan wel zeggen dat dit gebruik was niet ronduit afgewezendoor Guido.)

? 'can' not in {'must', 'should'}


Antwoord 3, autoriteit 14%

Vanaf Python 3.5 en PEP484wordt de letterlijke ellips gebruikt om bepaalde typen aan te duiden naar een statische typecontrole bij gebruik van de module typen.

Voorbeeld 1:

Hoge tupels van willekeurige lengte kunnen worden uitgedrukt met één type en ellips, bijvoorbeeld Tuple[int, ...]

Voorbeeld 2:

Het is mogelijk om het retourtype van een callable te declareren zonder de callsignatuur te specificeren door een letterlijke ellips (drie punten) te vervangen door de lijst met argumenten:

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body

Antwoord 4, autoriteit 7%

U kunt de Ellipsis ook gebruiken bij het specificeren van verwachte doctest-uitvoer:

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

Antwoord 5, autoriteit 7%

Samenvattend wat anderen hebben gezegd, vanaf Python 3, is Ellipsis in wezen een andere singleton-constante vergelijkbaar met None, maar zonder een specifiek bedoeld gebruik. Bestaande toepassingen zijn onder meer:

  • In segmentsyntaxis om het volledige segment in de resterende dimensies weer te geven
  • In typehints om slechts een deel van een type aan te geven (Callable[..., int]of Tuple[str, ...])
  • Typ stub-bestanden om aan te geven dat er een standaardwaarde is zonder deze op te geven

Mogelijk gebruik kan zijn:

  • Als standaardwaarde voor plaatsen waar Noneeen geldige optie is
  • Als de inhoud voor een functie die u nog niet heeft geïmplementeerd

Antwoord 6, autoriteit 5%

Van de Python-documentatie:

Dit object wordt vaak gebruikt door te slicen (zie Plakken). Het ondersteunt nee
speciale operaties. Er is precies één ellipsobject, genaamd
Ellipsis (een ingebouwde naam). type(Ellipsis)()produceert de Ellipsis
eenling.

Het wordt geschreven als Ellipsisof ....


Antwoord 7, autoriteit 3%

__getitem__minimaal ...voorbeeld in een aangepaste klasse

Wanneer de magische syntaxis ...wordt doorgegeven aan []in een aangepaste klasse, ontvangt __getitem__()een Ellipsisklasseobject.

De klasse kan dan doen wat ze wil met dit Singleton-object.

Voorbeeld:

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 the Ellipsis class object.
# Ellipsis is a singleton, so we can compare with `is`.
assert C()[...] is Ellipsis
# Everything mixed up.
assert C()[1, 2:3:4, ..., 6] == (1, slice(2,3,4), Ellipsis, 6)

De in Python ingebouwde list-klasse kiest ervoor om het de semantiek van een bereik te geven, en elk verstandig gebruik ervan zou dat natuurlijk ook moeten doen.

Persoonlijk zou ik er gewoon vanaf blijven in mijn API’s en in plaats daarvan een aparte, meer expliciete methode maken.

Getest in Python 3.5.2 en 2.7.12.


Antwoord 8, autoriteit 2%

Je kunt Ellipsis zelf gebruiken, in aangepaste slicing-situaties zoals numpy heeft gedaan, maar het heeft geen gebruik in een ingebouwde klasse.

Ik weet niet of het speciaal is toegevoegd voor gebruik in numpy, maar ik heb het zeker niet ergens anders gebruikt.

Zie ook: Hoe gebruik je de ellipsis syntaxis snijden in Python?


Antwoord 9, autoriteit 2%

Zoals vermeld door @no?????z??? en @phoenix – Je kunt het inderdaad gebruiken in stub-bestanden. bijv.

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

Meer informatie en voorbeelden van het gebruik van deze ellips vindt u hier https://www.python.org/dev/peps/pep-0484/#stub-files


Antwoord 10

Het beoogde gebruik zou niet alleen voor deze modules van derden moeten zijn. Het wordt niet goed vermeld in de Python-documentatie (of misschien kon ik dat gewoon niet vinden) maar de ellipsis ...wordt daadwerkelijk gebruikt in CPythonin ten minste één plaats.

Het wordt gebruikt voor het weergeven van oneindige datastructuren in Python. Ik kwam deze notatie tegen tijdens het spelen met lijsten.

Zie deze vraagvoor meer informatie.


Antwoord 11

Dit komt overeen.

l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]

...is een constante gedefinieerd in built-in constants.

Ellips

Hetzelfde als het beletselteken letterlijke … . Speciale waarde die meestal wordt gebruikt in combinatie met uitgebreide slicing-syntaxis voor door de gebruiker gedefinieerde containergegevenstypen.


Antwoord 12

In typer...wordt gebruikt om vereiste parameters te maken: de klasse Argumentverwacht een standaardwaarde, en als u de ...doorgeeft, zal deze klagen als de gebruiker het specifieke argument niet doorgeeft.

Je zou Nonevoor hetzelfde kunnen gebruiken als Ellipsiser niet was, maar dit zou de mogelijkheid om dat Noneuit te drukken wegnemen isde standaardwaarde, voor het geval dat zinvol is in uw programma.


Antwoord 13

FastAPI maakt gebruik van de Ellipsis voor het maken van de vereiste parameters.
https://fastapi.tiangolo.com/tutorial/query-params-str -validaties/


Antwoord 14

Voor iedereen die tot dit antwoord komt door te werken in een codebase met zwaar Pydantic-gebruik: dit is ook hoe Pydantic een veld aangeeft dat vereist is maar kan worden ingesteld op None, waarnaar ze verwijzen als ” verplichte optionele velden“. Daarom worden ze ook in FastAPI gebruikt.

Other episodes