Atomy są najbardziej podstawowymi elementami wyrażeń. Najprostszymi z nich są identyfikatory oraz literały. Składniowo za atomy uznawane są również elementy ujęte w odwrócone apostrofy, nawiasy zwykłe lub kwadratowe. Składnia atomów przedstawia się następująco:
atom |
::= | identifier | literal | enclosure |
enclosure |
::= | parenth_form | list_display |
| dict_display | string_conversion |
Identyfikator występujący jako atom jest nazwą. Opis obsługi nazw i ich dowiązań znajduje się w sekcji 4.1.
Jeśli nazwa jest powiązana z obiektem, wynikiem wartościowania atomu jest ten obiekt. Jeśli nazwa nie jest z niczym powiązana, przy próbie wartościowania generowany jest wyjątek NameError.
Maglowanie nazw prywatnych:
w przypadku, gdy identyfikator, mieszczący się tekstowo wewnątrz definicji
klasy, rozpoczyna się dwoma znakami podkreślenia i nie kończy się dwoma
znakami podkreślenia, traktowany jest jako nazwa prywatna tej klasy.
Nazwy prywatne są przekształcane w dłuższe nazwy na etapie generowania kodu
klasy. Przekształcenie polega na dołączeniu nazwy klasy przez nazwą
właściwą, usunięciu początkowych znaków podkreślenia i dodaniu zamiast tego
pojedynczego podkreślenia przed nazwą klasy. Na przykład, identyfikator
__spam występujący w klasie o nazwie Ham zostanie
przekształcony w _Ham__spam. Przekształcenie nie zależy od kontekstu
składniowego, w jakim identyfikator został użyty. Jeśli otrzymana w
wyniku przekształcenia nazwa będzie bardzo długa (przekroczy 255 znaków),
może nastąpić jej obcięcie w sposób zdefiniowany przez implementację.
Przekształcenie nie ma miejsca, jeśli nazwa klasy składa się wyłącznie
ze znaków podkreślenia.
Python obsługuje literały napisowe i różne literały liczbowe:
literal |
::= | stringliteral | integer | longinteger |
| floatnumber | imagnumber |
Wynikiem wartościowania literału jest obiekt określonego typu (napisowego, całkowitoliczbowego, długiego całkowitoliczbowego, zmiennoprzecinkowego, zespolonego) z podaną wartością. W przypadku literałów zmiennoprzecinkowych oraz urojonych (zespolonych) wartość może zostać zaokrąglona. Aby uzyskać więcej szczegółów, zajrzyj do sekcji 2.4.
Wszystkie literały odnoszą się do niezmiennych typów danych, w związku z czym tożsamości takich obiektów są mniej ważne od ich wartości. Wielokrotne wartościowane literałów o tej samej wartości (tych samych lub różnych wystąpień w tekście programu) może dawać jako wynik ten sam obiekt lub różne obiekty o tej samej wartości.
Elementy ujęte w nawiasy to opcjonalna lista wyrażeń, obustronnie otoczona nawiasami okrągłymi:
parenth_form |
::= | "(" [expression_list] ")" |
Wartością listy wyrażeń ujętej w nawiasy jest wartość samej listy wyrażeń: jeśli lista zawiera przynajmniej jeden przecinek, wartością jest krotka, w przeciwnym wypadku jest to wartość pojedynczego wyrażenia.
Wartością pustej pary nawiasów jest obiekt krotki. Ponieważ krotki są niezmienne, odnoszą się do nich reguły stosowane dla literałów (tj. dwa wystąpienia pustych krotek mogą, lecz nie muszą, dawać w wyniku ten sam obiekt).
Zwróćmy uwagę, że krotki nie są tworzone przez nawiasy okrągłe, ale przez fakt użycia operatora przecinka. Jedynym wyjątkiem jest krotka pusta, w której przypadku nawiasy są wymagane -- dopuszczenie w wyrażeniach "niczego", bez obejmujących nawiasów prowadziłoby do niejednoznaczności i możliwości przeoczenia typowych literówek.
Drukowalną formą listy jest (być może pusta) seria wyrażeń rozdzielonych przecinkami i ujętych w nawiasy kwadratowe:
test |
::= | and_test ( "or" and_test )*
| lambda_form |
testlist |
::= | test ( "," test )* [ "," ] |
list_display |
::= | "[" [listmaker] "]" |
listmaker |
::= | expression ( list_for
| ( "," expression )* [","] ) |
list_iter |
::= | list_for | list_if |
list_for |
::= | "for" expression_list "in" testlist
[list_iter] |
list_if |
::= | "if" test [list_iter] |
Drukowalna postać listy daje jako wartość nowy obiekt listy. Jej zawartość określa podana lista wyrażeń lub wytwornik listy. Jeśli zostanie użyta lista wyrażeń rozdzielonych przecinkami, następuje ich wartościowanie od lewej do prawej i umieszczanie w tej kolejności jako elementów w obiekcie listy. Jeśli zostanie użyty wytwornik listy, powinien się on składać z pojedynczego wyrażenia z występującą po nim przynajmniej jedną klauzulą for, a następnie dowolną (w tym równą zeru) liczbą klauzul for lub if. W tym przypadku elementami nowej listy są te, które zostałyby wytworzone po potraktowaniu każdej z klauzul for lub if jako bloki zagnieżdżone od lewej do prawej i wartościowaniu wyrażenia dającego kolejny element za każdym razem, gdy zostanie osiągnięty najbardziej wewnętrzny blok.
Drukowalną formą słownika jest (być może pusta) seria par klucz/dana, ujęta w nawiasy klamrowe:
dict_display |
::= | "{" [key_datum_list] "}" |
key_datum_list |
::= | key_datum ("," key_datum)* [","] |
key_datum |
::= | expression ":" expression |
Drukowalna postać słownika daje jako wartość nowy obiekt słownika.
Pary klucz/data wartościowane są od lewej do prawej i definiują elementy słownika: każdy obiekt klucza używany jest jako klucz, pod którym przechowywana jest występująca po nim wartość.
Ograniczenia nakładane na typy wartości służących za klucze są wymienione w sekcji 3.2. (Najkrócej rzecz ujmując, typ klucza powinien pozwalać na obliczenie funkcji mieszającej, co wyklucza wszystkie obiekty zmienne.) Niezgodności pomiędzy powtórzonymi kluczami nie są wykrywane; w takich przypadkach użyta zostanie ostatnia dana przypisana określonemu kluczowi (umieszczona w postaci drukowalnej najbardziej na prawo).
Konwersja napisowa to lista wyrażeń ujęta w odwrócone apostrofy:
string_conversion |
::= | "`" expression_list "`" |
Przy konwersji napisowej wartościowana jest lista wyrażeń, a otrzymany obiekt jest następnie konwertowany do napisu, zgodnie z regułami specyficznymi dla jego typu.
Jeśli obiekt jest napisem, liczbą, wartością None, ew. krotką,
listą lub słownikiem, zawierającymi wyłącznie obiekty jednego z wymienionych
typów, wówczas otrzymany napis jest poprawnym wyrażeniem w Pythonie, które
może zostać przekazane funkcji eval(), dając w wyniku
wyrażenie o tej samej wartości, co wyrażenie pierwotne (lub jego
przybliżenie, jeśli użyto np. liczb zmiennoprzecinkowych).
(W szczególności, konwersja napisowa napisu powoduje otoczenie go odpowiednimi znakami cytowania oraz użycie odpowiednich sekwencji specjalnych w miejsce "śmiesznych" znaków, tak, aby wynik zawierał tylko znaki drukowalne.)
Obiekty rekurencyjne (na przykład listy lub słowniki, które zawierają odwołania do nich samych, być może pośrednio) odnotowują rekurencyjne odwołania przy użyciu zapisu "...", a napisu otrzymanego w wyniku takiego zabiegu nie można przekazać funkcji eval(), aby otrzymać wartość równą początkowemu obiektowi (przy napisie w takiej postaci zostanie wygenerowany wyjątek SyntaxError).
Wywołanie wbudowanej funkcji repr() powoduje przeprowadzenie na przekazanym jej obiekcie dokładnie tej samej konwersji, co ujęcie go w nawiasy, a następnie w odwrócone apostrofy. Wbudowana funkcja str() przeprowadza podobną konwersję, choć jej wyniki są bardziej przyjazne dla odbiorcy.
Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.