types — Δημιουργία δυναμικών τύπων και ονόματα για ενσωματωμένους τύπους

Πηγαίος κώδικας: Lib/types.py


Αυτό το module ορίζει συναρτήσεις βοηθητικού προγράμματος για να διευκολύνει τη δυναμική δημιουργία νέων τύπων.

Ορίζει επίσης ονόματα για κάποιους τύπους αντικειμένων που χρησιμοποιούνται από τον τυπικό διερμηνέα Python, αλλά δεν εκτίθενται ως ενσωματωμένα όπως οι int ή str.

Τέλος, παρέχει κάποιες πρόσθετες κλάσεις και συναρτήσεις σχετικές με τους τύπους που δεν είναι αρκετά θεμελιώδεις ώστε να είναι ενσωματωμένες.

Δημιουργία Δυναμικών Τύπων

types.new_class(name, bases=(), kwds=None, exec_body=None)

Δημιουργεί ένα αντικείμενο κλάσης δυναμικά χρησιμοποιώντας την κατάλληλη μετακλάση.

Τα τρία πρώτα ορίσματα είναι τα στοιχεία που αποτελούν την επικεφαλίδα του ορισμού κλάσης: το όνομα της κλάσης, οι βάσεις κλάσης (με τη σειρά), τα ορίσματα λέξεων-κλειδιών (όπως metaclass).

Το όρισμα exec_body είναι μια συνάρτηση που χρησιμοποιείται για να γεμίσει το φρέσκο δημιουργημένο namespace κλάσης. Πρέπει να δέχεται το namespace της κλάσης ως μοναδικό όρισμα και να ενημερώνει άμεσα το namespace με τα περιεχόμενα της κλάσης. Αν δεν παρέχεται καμία συνάρτηση, έχει το ίδιο αποτέλεσμα με την παράδοση lambda ns: None.

Added in version 3.3.

types.prepare_class(name, bases=(), kwds=None)

Υπολογίζει την κατάλληλη μετακλάση και δημιουργεί το namespace της κλάσης.

Τα ορίσματα είναι τα στοιχεία που αποτελούν την επικεφαλίδα του ορισμού κλάσης: το όνομα της κλάσης, οι βάσεις κλάσης (με τη σειρά) και τα ορίσματα λέξεων-κλειδιών (όπως metaclass).

Η επιστρεφόμενη τιμή είναι μια 3-πλειάδα: metaclass, namespace, kwds

metaclass είναι η κατάλληλη μετακλάση, namespace είναι το προετοιμασμένο namespace κλάσης και kwds είναι μια ενημερωμένη αντιγραφή του περασμένου ορίσματος kwds με οποιαδήποτε είσοδο 'metaclass' αφαιρεθεί. Αν δεν περαστεί κανένα όρισμα kwds, αυτό θα είναι ένα κενό dict.

Added in version 3.3.

Άλλαξε στην έκδοση 3.6: Η προεπιλεγμένη τιμή για το στοιχείο namespace της επιστρεφόμενης πλειάδας έχει αλλάξει. Τώρα χρησιμοποιείται μια χαρτογράφηση που διατηρεί τη σειρά εισαγωγής όταν η μετακλάση δεν έχει μέθοδο __prepare__.

Δείτε επίσης

Metaclasses

Πλήρεις λεπτομέρειες της διαδικασίας δημιουργίας κλάσης που υποστηρίζεται από αυτές τις συναρτήσεις

PEP 3115 - Μετακλάσεις στην Python 3000

Εισήγαγε το hook namespace __prepare__

types.resolve_bases(bases)

Επιλύει τις καταχωρήσεις MRO δυναμικά όπως καθορίζεται από την PEP 560.

Αυτή η συνάρτηση αναζητά στοιχεία στις bases που δεν είναι στιγμιότυπα της type, και επιστρέφει μια πλειάδα όπου κάθε τέτοιο αντικείμενο που έχει μια μέθοδο __mro_entries__() αντικαθίσταται με ένα αποσυσκευασμένο αποτέλεσμα της κλήσης αυτής της μεθόδου. Αν ένα στοιχείο bases είναι στιγμιότυπο της type, ή δεν έχει μια μέθοδο __mro_entries__(), τότε περιλαμβάνεται στην επιστρεφόμενη πλειάδα χωρίς αλλαγές.

Added in version 3.7.

types.get_original_bases(cls, /)

Επιστρέφει την πλειάδα αντικειμένων που δόθηκαν αρχικά ως βάσεις του cls πριν κληθεί η μέθοδος __mro_entries__() σε οποιαδήποτε βάση (ακολουθώντας τους μηχανισμούς που καθορίζονται στην PEP 560). Αυτό είναι χρήσιμο για την ανάλυση των Generics.

Για κλάσεις που έχουν ένα χαρακτηριστικό __orig_bases__, αυτή η συνάρτηση επιστρέφει την τιμή του cls.__orig_bases__. Για κλάσεις χωρίς το χαρακτηριστικό __orig_bases__, επιστρέφεται cls.__bases__.

Παραδείγματα:

from typing import TypeVar, Generic, NamedTuple, TypedDict

T = TypeVar("T")
class Foo(Generic[T]): ...
class Bar(Foo[int], float): ...
class Baz(list[str]): ...
Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
Spam = TypedDict("Spam", {"a": int, "b": str})

assert Bar.__bases__ == (Foo, float)
assert get_original_bases(Bar) == (Foo[int], float)

assert Baz.__bases__ == (list,)
assert get_original_bases(Baz) == (list[str],)

assert Eggs.__bases__ == (tuple,)
assert get_original_bases(Eggs) == (NamedTuple,)

assert Spam.__bases__ == (dict,)
assert get_original_bases(Spam) == (TypedDict,)

assert int.__bases__ == (object,)
assert get_original_bases(int) == (object,)

Added in version 3.12.

Δείτε επίσης

PEP 560 - Βασική υποστήριξη για το module typing και γενικούς τύπους

Τυπικοί Τύποι Διερμηνέα

Αυτό το module παρέχει ονόματα για πολλούς από τους τύπους που απαιτούνται για να υλοποιηθεί ένας διερμηνέας Python. Αποφεύγει σκόπιμα να συμπεριλάβει κάποιους από τους τύπους που προκύπτουν μόνο παρεμπιπτόντως κατά τη διάρκεια της επεξεργασίας, όπως ο τύπος listiterator.

Τυπική χρήση αυτών των ονομάτων είναι για ελέγχους isinstance() ή issubclass().

Αν δημιουργήσετε στιγμιότυπα από αυτούς τους τύπους, σημειώστε ότι οι υπογραφές μπορεί να διαφέρουν μεταξύ εκδόσεων Python.

Τυπικά ονόματα ορίζονται για τους παρακάτω τύπους:

types.NoneType

Ο τύπος του None.

Added in version 3.10.

types.FunctionType
types.LambdaType

Ο τύπος των συναρτήσεων που ορίζονται από τον χρήστη και των συναρτήσεων που δημιουργούνται από εκφράσεις lambda.

Κάνει raise ένα auditing event function.__new__ με το όρισμα code.

Το audit event συμβαίνει μόνο για άμεσες δημιουργίες αντικειμένων συναρτήσεων και δεν γίνεται raise κατά τη διάρκεια της κανονικής μεταγλώττισης.

types.GeneratorType

Ο τύπος των αντικειμένων generator-iterator, που δημιουργούνται από συναρτήσεις γεννητριών.

types.CoroutineType

Ο τύπος των αντικειμένων coroutine, που δημιουργούνται από συναρτήσεις async def.

Added in version 3.5.

types.AsyncGeneratorType

Ο τύπος των αντικειμένων asynchronous generator-iterator, που δημιουργούνται από ασύγχρονες συναρτήσεις γεννητριών.

Added in version 3.6.

class types.CodeType(**kwargs)

Ο τύπος των code objects όπως επιστρέφεται από τη compile().

Κάνει raise ένα auditing event code.__new__ με τα ορίσματα code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags.

Σημειώστε ότι τα ελεγχόμενα ορίσματα μπορεί να μην ταιριάζουν με τα ονόματα ή τις θέσεις που απαιτούνται από τον αρχικοποιητή. Το audit event συμβαίνει μόνο για άμεσες δημιουργίες αντικειμένων κώδικα και δεν γίνεται raise κατά τη διάρκεια της κανονικής μεταγλώττισης.

types.CellType

Ο τύπος για τα αντικείμενα κελιών: τέτοια αντικείμενα χρησιμοποιούνται ως δοχεία για τις closure variables μιας συνάρτησης.

Added in version 3.8.

types.MethodType

Ο τύπος των μεθόδων των στιγμιοτύπων κλάσεων που ορίζονται από τον χρήστη.

types.BuiltinFunctionType
types.BuiltinMethodType

Ο τύπος των ενσωματωμένων συναρτήσεων όπως len() ή sys.exit(), και μεθόδων ενσωματωμένων κλάσεων. (Εδώ, ο όρος «built-in» σημαίνει «γραμμένος σε C».)

types.WrapperDescriptorType

Ο τύπος των μεθόδων κάποιων ενσωματωμένων τύπων δεδομένων και βάσεων κλάσεων όπως object.__init__() ή object.__lt__().

Added in version 3.7.

types.MethodWrapperType

Ο τύπος των bound μεθόδων κάποιων ενσωματωμένων τύπων δεδομένων και βάσεων κλάσεων. Για παράδειγμα είναι ο τύπος του object().__str__.

Added in version 3.7.

types.NotImplementedType

Ο τύπος του NotImplemented.

Added in version 3.10.

types.MethodDescriptorType

Ο τύπος των μεθόδων κάποιων ενσωματωμένων τύπων δεδομένων όπως str.join().

Added in version 3.7.

types.ClassMethodDescriptorType

Ο τύπος των unbound μεθόδων κλάσης κάποιων ενσωματωμένων τύπων δεδομένων όπως dict.__dict__['fromkeys'].

Added in version 3.7.

class types.ModuleType(name, doc=None)

Ο τύπος των modules. Ο κατασκευαστής δέχεται το όνομα του module που θα δημιουργηθεί και προαιρετικά την docstring του.

Δείτε επίσης

Documentation on module objects

Παρέχει λεπτομέρειες για τα ειδικά χαρακτηριστικά που μπορούν να βρεθούν σε στιγμιότυπα της ModuleType.

importlib.util.module_from_spec()

Τα modules που δημιουργούνται χρησιμοποιώντας τον κατασκευαστή ModuleType δημιουργούνται με πολλά από τα ειδικά χαρακτηριστικά τους μη ρυθμισμένα ή ρυθμισμένα σε προεπιλεγμένες τιμές. Η module_from_spec() παρέχει έναν πιο ανθεκτικό τρόπο δημιουργίας στιγμιοτύπων ModuleType που διασφαλίζει ότι τα διάφορα χαρακτηριστικά είναι ρυθμισμένα κατάλληλα.

types.EllipsisType

Ο τύπος του Ellipsis.

Added in version 3.10.

class types.GenericAlias(t_origin, t_args)

O τύπος των parameterized generics όπως το list[int].

t_origin θα πρέπει να είναι μια μη παραμετροποιημένη γενική κλάση, όπως list, tuple ή dict. t_args θα πρέπει να είναι μια tuple (πιθανώς μήκους 1) τύπων που παραμετροποιούν το t_origin:

>>> from types import GenericAlias

>>> list[int] == GenericAlias(list, (int,))
True
>>> dict[str, int] == GenericAlias(dict, (str, int))
True

Added in version 3.9.

Άλλαξε στην έκδοση 3.9.2: Αυτός ο τύπος μπορεί πλέον να κληρονομείται.

Δείτε επίσης

Generic Alias Types

Λεπτομερής τεκμηρίωση για τα στιγμιότυπα της types.GenericAlias

PEP 585 - Υποδείξεις τύπου Generics σε τυπικές συλλογές

Εισαγωγή στην κλάση types.GenericAlias

class types.UnionType

Ο τύπος των union type expressions.

Added in version 3.10.

Άλλαξε στην έκδοση 3.14: Αυτό είναι τώρα ένα ψευδώνυμο για την κλάση typing.Union.

class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)

Ο τύπος των αντικειμένων traceback όπως αυτά που βρίσκονται στο sys.exception().__traceback__.

Δείτε the language reference για λεπτομέρειες σχετικά με τα διαθέσιμα χαρακτηριστικά και τις λειτουργίες, καθώς και οδηγίες για τη δυναμική δημιουργία tracebacks.

types.FrameType

Ο τύπος των frame objects όπως αυτά που βρίσκονται στο tb.tb_frame αν το tb είναι ένα αντικείμενο traceback.

types.FrameLocalsProxyType

The type of frame locals proxy objects, as found on the frame.f_locals attribute.

Added in version 3.15.0a0 (unreleased).

Δείτε επίσης

PEP 667

types.GetSetDescriptorType

Ο τύπος των αντικειμένων που ορίζονται σε επεκτάσιμα modules με PyGetSetDef, όπως FrameType.f_locals ή array.array.typecode. Αυτός ο τύπος χρησιμοποιείται ως περιγραφέας για τα χαρακτηριστικά του αντικειμένου. Έχει τον ίδιο σκοπό με τον τύπο property, αλλά για κλάσεις που ορίζονται σε επεκτάσιμα modules.

types.MemberDescriptorType

Ο τύπος των αντικειμένων που ορίζονται σε επεκτάσιμα modules με PyMemberDef, όπως το datetime.timedelta.days. Αυτός ο τύπος χρησιμοποιείται ως περιγραφέας για απλά μέλη δεδομένων C που χρησιμοποιούν τυπικές συναρτήσεις μετατροπής. Έχει τον ίδιο σκοπό με τον τύπο property, αλλά για κλάσεις που ορίζονται σε επεκτάσιμα modules.

Επιπλέον, όταν μια κλάση ορίζεται με ένα χαρακτηριστικό __slots__, τότε για κάθε slot, θα προστεθεί ένα στιγμιότυπο της MemberDescriptorType ως χαρακτηριστικό στην κλάση. Αυτό επιτρέπει στο slot να εμφανίζεται στο __dict__ της κλάσης.

Σε άλλες υλοποιήσεις της Python, αυτός ο τύπος μπορεί να είναι ταυτόσημος με το GetSetDescriptorType.

class types.MappingProxyType(mapping)

Read-only αναγνωριστικό για μια αντιστοίχιση. Παρέχει μια δυναμική προβολή στις καταχωρήσεις της αντιστοίχισης, που σημαίνει ότι όταν η αντιστοίχιση αλλάζει, η προβολή αντικατοπτρίζει αυτές τις αλλαγές.

Added in version 3.3.

Άλλαξε στην έκδοση 3.9: Ενημερώθηκε για να υποστηρίζει τον νέο τελεστή ένωσης (|) από την PEP 584, ο οποίος απλά αναθέτει στην υποκείμενη αντιστοίχιση.

key in proxy

Επιστρέφει True αν η υποκείμενη αντιστοίχιση έχει το κλειδί key, αλλιώς False.

proxy[key]

Επιστρέφει το στοιχείο της υποκείμενης αντιστοίχισης με το κλειδί key. Κάνει raise μια KeyError αν το key δεν είναι στην υποκείμενη αντιστοίχιση.

iter(proxy)

Επιστρέφει έναν iterator πάνω από τα κλειδιά της υποκείμενης αντιστοίχισης. Αυτό είναι μια συντόμευση για iter(proxy.keys()).

len(proxy)

Επιστρέφει τον αριθμό των στοιχείων στην υποκείμενη αντιστοίχιση.

copy()

Επιστρέφει ένα ρηχό αντίγραφο της υποκείμενης αντιστοίχισης.

get(key[, default])

Επιστρέφει την τιμή για το key αν το key είναι στην υποκείμενη αντιστοίχιση, αλλιώς default. Αν το default δεν δοθεί, προεπιλέγεται σε None, έτσι ώστε αυτή η μέθοδος να μην κάνει ποτέ raise μια KeyError.

items()

Επιστρέφει μια νέα προβολή των στοιχείων της υποκείμενης αντιστοίχισης (ζεύγη (key, value)).

keys()

Επιστρέφει μια νέα προβολή των κλειδιών της υποκείμενης αντιστοίχισης.

values()

Επιστρέφει μια νέα προβολή των τιμών της υποκείμενης αντιστοίχισης.

reversed(proxy)

Επιστρέφει έναν αντίστροφο iterator πάνω από τα κλειδιά της υποκείμενης αντιστοίχισης.

Added in version 3.9.

hash(proxy)

Επιστρέφει ένα hash της υποκείμενης αντιστοίχισης.

Added in version 3.12.

class types.CapsuleType

Ο τύπος των capsule objects.

Added in version 3.13.

Πρόσθετες βοηθητικές κλάσεις και συναρτήσεις

class types.SimpleNamespace

Απλή υποκλάση object που παρέχει πρόσβαση χαρακτηριστικών στο χώρο ονομάτων της, καθώς και μια σημαντική αναπαράσταση.

Σε αντίθεση με την object, με την SimpleNamespace μπορείτε να προσθέσετε και να αφαιρέσετε χαρακτηριστικά.

Τα αντικείμενα SimpleNamespace μπορούν να αρχικοποιηθούν με τον ίδιο τρόπο όπως η dict: είτε με ονόματα χαρακτηριστικών, είτε με ένα μόνο οριστικό όρισμα, είτε και με τα δύο. Όταν αρχικοποιούνται με ονόματα χαρακτηριστικών, αυτά προστίθενται απευθείας στο υποκείμενο χώρο ονομάτων. Εναλλακτικά, όταν αρχικοποιούνται με ένα οριστικό όρισμα, το υποκείμενο χώρο ονομάτων θα ενημερωθεί με ζεύγη κλειδιού-τιμής από αυτό το όρισμα (είτε ένα αντικείμενο αντιστοίχισης είτε ένα iterable αντικείμενο που παράγει ζεύγη κλειδιού-τιμής). Όλα αυτά τα κλειδιά πρέπει να είναι συμβολοσειρές.

Ο τύπος είναι περίπου ισοδύναμος με τον παρακάτω κώδικα:

class SimpleNamespace:
    def __init__(self, mapping_or_iterable=(), /, **kwargs):
        self.__dict__.update(mapping_or_iterable)
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"{k}={v!r}" for k, v in self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented

Το SimpleNamespace μπορεί να είναι χρήσιμο ως αντικατάσταση για το class NS: pass. Ωστόσο, για έναν δομημένο τύπο εγγραφής χρησιμοποιήστε namedtuple() αντί αυτού.

SimpleNamespace αντικείμενα υποστηρίζονται από την copy.replace().

Added in version 3.3.

Άλλαξε στην έκδοση 3.9: Η σειρά των χαρακτηριστικών στην αναπαράσταση άλλαξε από αλφαβητική σε εισαγωγή (όπως το dict).

Άλλαξε στην έκδοση 3.13: Προστέθηκε υποστήριξη για ένα προαιρετικό οριστικό όρισμα.

types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)

Δρομολόγηση πρόσβασης χαρακτηριστικών σε μια κλάση στο __getattr__.

Αυτός είναι ένας περιγραφέας, που χρησιμοποιείται για τον ορισμό χαρακτηριστικών που δρουν διαφορετικά όταν προσπελάζονται μέσω ενός στιγμιότυπου και μέσω μιας κλάσης. Η πρόσβαση στο στιγμιότυπο παραμένει κανονική, αλλά η πρόσβαση σε ένα χαρακτηριστικό μέσω μιας κλάσης θα δρομολογηθεί στη μέθοδο __getattr__ της κλάσης. Αυτό γίνεται κάνοντας raise ένα AttributeError.

Αυτό επιτρέπει να έχετε ιδιότητες ενεργές σε ένα στιγμιότυπο και να έχετε εικονικά χαρακτηριστικά στην κλάση με το ίδιο όνομα (βλ. enum.Enum για παράδειγμα).

Added in version 3.4.

Βοηθητικές Συναρτήσεις Coroutine

types.coroutine(gen_func)

Αυτή η συνάρτηση μετατρέπει μια generator συνάρτηση σε μια coroutine function που επιστρέφει μια coroutine βασισμένη σε γεννήτρια. Η coroutine βασισμένη σε γεννήτρια είναι ακόμα ένας generator iterator, αλλά θεωρείται επίσης ότι είναι ένα αντικείμενο coroutine και είναι awaitable. Ωστόσο, δεν είναι απαραίτητο να υλοποιεί τη μέθοδο __await__().

Αν το gen_func είναι μια γεννήτρια συνάρτηση, θα τροποποιηθεί επιτόπου.

Αν το gen_func δεν είναι μια γεννήτρια συνάρτηση, θα τυλιχθεί. Αν επιστρέφει μια παρουσία της collections.abc.Generator, το στιγμιότυπο θα τυλιχθεί σε ένα awaitable αντικείμενο proxy. Όλοι οι άλλοι τύποι αντικειμένων θα επιστραφούν όπως είναι.

Added in version 3.5.