Co oznacza ukośnik w wyjściu help ()?

Co oznacza / w wyjściu Pythona 3.4 help dla range przed nawiasem zamykającym?

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return a virtual sequence of numbers from start to stop by step.
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.

                                        ...
Author: wjandrea, 2014-07-14

3 answers

Oznacza koniec tylko parametry pozycyjne , parametry, których nie można używać jako parametrów słów kluczowych. Przed Pythonem 3.8 takie parametry mogły być określone tylko w C API.

Oznacza to, że argument key do __contains__ może być przekazywany tylko przez position (range(5).__contains__(3)), a nie jako argument słowa kluczowego (range(5).__contains__(key=3)), coś, co może zrobić z argumentami pozycyjnymi w funkcjach czystego Pythona.

Zobacz też Argument Clinic dokumentacja:

Aby oznaczyć wszystkie parametry jako pozycyjne - tylko w argumencie Clinic, dodaj / na samej linii po ostatnim parametrze, wciętym tak samo jak linie parametru.

I (najnowszy dodatek do) Python FAQ :

Ukośnik na liście argumentów funkcji oznacza, że wcześniejsze parametry są tylko pozycyjne. Pozycjonowanie-tylko parametry są te bez nazwy użytkowej zewnętrznie. Po wywołaniu funkcja, która akceptuje tylko parametry pozycyjne, argumenty są mapowane do parametrów wyłącznie na podstawie ich pozycji.

Składnia jest obecnie częścią specyfikacji języka Python, od wersji 3.8 , Zobacz PEP 570- parametry tylko pozycyjne Pythona. Przed PEP 570 składnia była już zarezerwowana dla ewentualnego przyszłego włączenia w Pythonie, zobacz składnię Pep 457 - dla parametrów tylko pozycyjnych.

Tylko Pozycjonowanie parametry mogą prowadzić do czystszych i bardziej przejrzystych interfejsów API, sprawić, że implementacje modułów tylko w C będą bardziej spójne i łatwiejsze w utrzymaniu, a ponieważ parametry tylko pozycyjne wymagają bardzo małego przetwarzania, prowadzą do szybszego kodu Pythona.

 207
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 12:15:03

To pytanie zadałem sobie sam. :) Okazało się, że / został pierwotnie zaproponowany przez Guido w tutaj .

Alternatywna propozycja: co powiesz na użycie'/'? Wręcz przeciwnie. '*'co oznacza "argument słowa kluczowego", a ' / ' nie jest nowym znakiem.

Wtedy jego propozycja wygrała.
Heh. Jeśli to prawda, moja propozycja " / " wygrywa:
 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

Myślę, że bardzo istotnym dokumentem obejmującym to jest PEP 570 . Gdzie sekcja podsumowania wygląda ładnie.

Podsumowanie

Przypadek użycia określi, które parametry mają zostać użyte w definicji funkcji:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

Jako wskazówki:

Używaj pozycyjnych - tylko wtedy, gdy nazwy nie mają znaczenia lub nie mają znaczenia, a jest tylko kilka argumentów, które zawsze będą przekazywane w tej samej kolejności. Użyj słowa kluczowego-tylko wtedy, gdy nazwy mają znaczenie, a definicja funkcji jest bardziej zrozumiała, ponieważ jest jednoznaczna z nazwami.


Jeśli funkcja kończy się na /

def foo(p1, p2, /)

Oznacza to, że wszystkie argumenty funkcyjne są pozycyjne.

 36
Author: prosti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-19 22:30:07

Ukośnik do przodu ( / ) wskazuje, że wszystkie argumenty przed nim są tylko pozycyjnymi argumentami. Funkcja positive only arguments została dodana w Pythonie 3.8 po zaakceptowaniu PEP 570 . Początkowo ta notacja została zdefiniowana w PEP 457-notacja do notacji tylko dla parametrów pozycyjnych

Parametry w definicji funkcji poprzedzającej ukośnik (/) są tylko pozycyjne, a parametry po ukośniku(/) mogą być dowolnego rodzaju zgodnie ze składnią. Gdzie są mapowane argumenty do pozycji tylko parametry oparte wyłącznie na ich pozycji po wywołaniu funkcji. Przekazywanie tylko pozycyjnych parametrów przez słowa kluczowe (nazwa) jest niepoprawne.

Weźmy następujący przykład

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

Tutaj w powyższej definicji funkcji parametry a i b są tylko pozycyjne, podczas gdy x lub y mogą być pozycyjne lub kluczowe.

Następujące wywołania funkcji są ważne

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

Ale następujące wywołanie funkcji nie jest poprawne, co powoduje wystąpienie wyjątku TypeError ponieważ a, b nie są przekazywane jako argumenty pozycyjne, zamiast tego przekazywane jako słowo kluczowe

foo(a=1.45, b=3.14, x=1, y=4)

TypeError: foo () ma pewne argumenty tylko pozycyjne przekazane jako słowo kluczowe arguments: "a, b"

Wiele wbudowanych funkcji w Pythonie akceptuje tylko argumenty pozycyjne, gdzie przekazywanie argumentów przez słowo kluczowe nie ma sensu. Na przykład wbudowana funkcja len akceptuje tylko jeden argument pozycyjny, gdzie wywołanie len jako len (obj="hello world") pogarsza czytelność, sprawdź pomoc(len).

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

Tylko parametry pozycyjne sprawiają, że podstawowe funkcje c / biblioteki są łatwe w utrzymaniu. Pozwala to na zmiany nazw parametrów tylko pozycyjnych w przyszłości bez ryzyka złamania kodu klienta używającego API

Wreszcie, tylko parametry pozycyjne pozwalają nam używać ich nazw do użycia w argumentach słów kluczowych o zmiennej długości. Sprawdź następujący przykład

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

Tylko parametry pozycyjne są lepiej wyjaśnione tutaj w typy argumenty funkcji w Pythonie: tylko parametry pozycyjne

Składnia tylko parametrów pozycyjnych została oficjalnie dodana do python3. 8. Checkout Co nowego python3. 8-tylko argumenty pozycyjne

Pep Related: PEP 570 -- Python Positive-Only Parameters

 12
Author: neotam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-08 09:55:15