"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.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.
