Що означає косою рисою у виводі help ()?


148

Що /означає helpвихід у Python 3.4 rangeперед закриттям дужок?

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

                                        ...

Відповіді:


185

Він означає кінець позиційних лише параметрів , параметрів, які не можна використовувати як параметри ключових слів. До Python 3.8 такі параметри можна було вказати лише в API API.

Це означає, що keyаргумент __contains__можна передавати лише позицією ( range(5).__contains__(3)), а не як аргумент ключового слова ( range(5).__contains__(key=3)), що можна зробити з позиційними аргументами у функціях pure-python.

Також дивіться документацію щодо клініки аргументів :

Щоб позначити всі параметри лише в позиції клініки аргументів, додайте a /на самій лінії після останнього параметра, з відступом так само, як і параметри рядків.

і (зовсім недавнє доповнення) до питання про Python :

Похила в списку аргументів функції позначає, що параметри, що передують їй, є лише позиційними. Позиційні лише параметри - це ті, що не мають зовнішньої корисної назви. Після виклику функції, яка приймає лише позиційні параметри, аргументи відображаються в параметри на основі виключно їх позиції.

Синтаксис тепер є частиною специфікації мови Python, версії 3.8 див. PEP 570 - Параметри лише для позиції Python . До PEP 570 синтаксис вже був зарезервований для можливого подальшого включення в Python, див. PEP 457 - Синтаксис для позиційних параметрів .

Параметри лише для позицій можуть призводити до більш чистих та чітких API, роблять реалізацію чистих Python іншим чином C-модулів більш послідовними та простішими в обслуговуванні, а оскільки для позиційних параметрів потрібна дуже мала обробка, вони призводять до більш швидкого коду Python.


22

Я сам задав це питання. :) З'ясували, що /спочатку був запропонований Гідо тут .

Альтернативна пропозиція: як щодо використання "/"? Це щось протилежне '*', що означає "аргумент ключового слова", а "/" не є новим символом.

Тоді його пропозиція перемогла .

Хе. Якщо це правда, моя пропозиція '/' виграє:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

Я думаю, що дуже важливим документом, що стосується цього, є PEP 570 . Там, де перегляньте розділ добре.

Резюме

Випадок використання визначає, які параметри використовувати у визначенні функції:

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

В якості керівництва:

Використовуйте позиційно, лише якщо імена не мають значення або не мають значення, і є лише кілька аргументів, які завжди передаватимуться в одному порядку. Використовуйте лише ключові слова, коли імена мають значення, а визначення функції зрозуміліше, якщо явні з іменами.


Якщо функція закінчується на /

def foo(p1, p2, /)

Це означає, що всі функціональні аргументи є позиційними.


6
Вибір /жетону, тому що "це зворотна операція *" показує, що Python просто трохи божевільний. Це свого роду синестезія.
Томаш

6

Нахил нахилу (/) вказує, що всі аргументи до нього є лише позиційним аргументом. Функція аргументів позиції була додана в python 3.8 після прийняття PEP 570 . Спочатку ця позначення була визначена в PEP 457 - Позначення для нотації лише для позиційних параметрів

Параметри у визначенні функції до нахилу Foraward (/) є лише позиційними, а параметри, слідом за косою косою (/), можуть мати будь-який вид відповідно до синтаксису. Якщо аргументи відображаються на позиційні лише параметри виключно на основі їх позиції при виклику функції. Передача параметрів лише позицій за ключовими словами (ім'ям) недійсна.

Візьмемо наступний приклад

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

Тут у наведених вище параметрах визначення функцій a і b є лише позиційними, тоді як x або y можуть бути або позиційними, або ключовими словами.

Наступні виклики функцій дійсні

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

Але наступний виклик функції недійсний, що викликає виняток TypeError, оскільки a, b не передаються як позиційні аргументи, а передаються як ключове слово

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

TypeError: foo () отримав деякі аргументи лише позиції як аргументи ключових слів: 'a, b'

Багато вбудованих функцій у python приймають лише позиційні аргументи, де передача аргументів за ключовим словом не має сенсу. Наприклад, вбудована функція len приймає лише один позиційний (лише) аргумент. Якщо виклик len як len (obj = "привіт світ") погіршує читабельність, перевірте довідку (len).

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

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

Позиційні лише параметри полегшують основні функції c / library легко підтримувати. Це дозволяє змінювати імена параметрів лише позиційних параметрів у майбутньому без ризику порушення коду клієнта, що використовує API

І останнє, але не менш важливе, лише позиційні параметри дозволяють нам використовувати їхні імена для аргументів ключових слів різної довжини. Перевірте наступний приклад

>>> 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}

Позиційні лише параметри краще Пояснено тут у розділі Типи аргументів функції в python: Позиційні лише параметри

Синтаксис лише позиційних параметрів офіційно додано до python3.8. Оформити замовлення Що нового python3.8 - позиційні тільки аргументи

Пов’язані з PEP: PEP 570 - Параметри, що відповідають лише позиції Python

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.