Dowiedziałem się o tym dzisiaj przez przypadek, gdy zauważyłem, że fragment kodu Pythona użył built-in functionall
jako identyfikatora zmiennej do przechowywania wyniku listowania i nie spowodował błędu, więc próbowałem następujących :Dlaczego możesz przypisać wartości wbudowanym funkcjom w Pythonie?
type('abc')
Out[1]: str
type('abc') == str
Out[2]: True
str = int
type('abc') == str
Out[4]: False
type('abc')
Out[5]: str
type = [1,2,3]
type('abc')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-a74a7df76db1> in <module>()
----> 1 type('abc')
TypeError: 'list' object is not callable
Mam nadzieję, że jest to prawidłowe pytanie, gdy zapytam, dlaczego to zachowanie jest dozwolone w Pythonie.
Albo jeszcze lepiej, jak mogę się upewnić, że funkcja wbudowana jest naprawdę jak str
str
i nie powiedzieć, int
tak str(123)
nie będą oceniane jako int(123)
przez przypadek?
Nie rzeczywiście przypisać dowolny wbudowany w obiekt. Zdefiniowałeś nowe globale, które maskowały wbudowane. Czemu? Ponieważ Python jest elastyczny. –
Dlaczego Python powinien powstrzymać Cię od nazywania rzeczy, które chcesz? Twoim obowiązkiem jest pozostawienie samych nazw ważnych wbudowanych, jeśli chcesz, aby działały normalnie. –
@MartijnPieters To całkiem interesujące, ale jak mogę się upewnić, że funkcja działa tak, jak myślę? – Vinayak