Czy można zastąpić wbudowane typy Pythona z niestandardowymi?

Chcę stworzyć coś takiego:

class MyInt(object):
   ...
__builtin__.int = MyInt
x = 5
4
Wojciech Danilo 3 sierpień 2012, 05:01

3 odpowiedzi

Najlepsza odpowiedź

Wydaje się, że możesz prosić, czy możliwe jest zastąpienie typu utworzonego podczas wprowadzania literałów . Odpowiedź brzmi nie. Nie możesz tego zrobić, aby x = 5 używa typu innego niż wbudowany int typ.

Możesz zastąpić __builtin__.int, ale to wpłynie tylko wyraźne użycie nazwy int, np., Kiedy to zrobisz int("5"). Nie ma mało miejsca do tego; Lepiej jest użyć regularnej klasy i zrobić {x3}}.

Co ważniejsze, możesz Może zapewnić przeciążenie operatora na swoich klasach, aby na przykład MyInt(5) + 5 działa i zwróci kolejny miint. Zrobiłbyś to, pisząc metodę __add__ dla klasy mite (wraz z __sub__ do odejmowania itp.).

4
BrenBarn 3 sierpień 2012, 01:50

Nie wiem o zastępując wbudowane, ale z pewnością możesz stworzyć obiekt, który dziedziczy z nich i / lub zachowuje się jak oni. Spójrz w górę, jak inherit from immutable i powinieneś znaleźć odpowiedzi, które pokazują naddrowienie __new__ lub na drugą opcję, zobacz "Emulacyjne typy numeryczne

2
John Mee 3 sierpień 2012, 01:22

Ponieważ chcesz napisać Pythonesque DSL, masz dwie opcje:

  1. Skompiluj kod do Ast Ast i idź odpowiednio Wymiana węzłów AST.
  2. Zbuduj swój własny ast.

Gdy masz AST, możesz iść dalej i wykonać go bezpośrednio. W obu przypadkach, spójrz na Usługi językowe Pythona do wytwarzania i manipulowania AST.

2
Ignacio Vazquez-Abrams 3 sierpień 2012, 19:03