Чтобы кодировать параметр в URL-адресе, я нахожу, что с помощью символа .alphanumerics
задан самый простой вариант:
let encoded = parameter.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
let url = "http://www.example.com/?name=\(encoded!)"
Использование любого из стандартных наборов символов для кодирования URL-адресов (например, URLQueryAllowedCharacterSet
или URLHostAllowedCharacterSet
) не будут работать, потому что они не исключают символы =
или &
.
Обратите внимание, что с помощью .alphanumerics
он кодирует некоторые символы, которые делают не нужно кодировать (например, .
, -
или _
). Я нахожу использование .alphanumerics
проще, чем создание пользовательского набора символов, и не против некоторых дополнительных символов, которые нужно закодировать. Если это вас беспокоит, создайте пользовательский набор символов, как описано в . Как процитировать кодировку URL String , например, например:
var allowed = CharacterSet.alphanumerics
allowed.insert(charactersIn: ".-_")
let encoded = parameter.addingPercentEncoding(withAllowedCharacters: allowed)
let url = "http://www.example.com/?name=\(encoded!)"
Внимание: параметр encoded
это сила, развернутая. Для недопустимой строки юникода может произойти сбой. См. . Почему возвращаемое значение String.addingPercentEncoding () необязательно? . Вместо развертывания силы encoded!
вы можете использовать encoded ?? ""
или использовать if let encoded = ...
.
Это понятие называется значением по умолчанию .
Используя этот синтаксис, вызывающая сторона может выбрать, указывать ли значение для каждого такого аргумента или использовать значение по умолчанию.
Предположим, у вас есть метод с поведением по умолчанию, но вы хотите зарезервировать возможность изменить его по своему желанию. Это даст вам эту силу.
Рассмотрим следующий пример:
def custom_method(msg, prefix=None):
tag = prefix if prefix else ''
print(tag + msg)
Теперь, как пользователь этого API, вы можете использовать префикс или избежать его:
custom_method('Dude', 'Hi')
# Prints 'Hi Dude'
Или: [ 118]
custom_method('Dude')
# Prints 'Dude'
Аргументы ключевых слов могут иметь значение по умолчанию. В этом случае значения по умолчанию a
и b
равны None
. Это означает, что когда эти аргументы не передаются в функцию, для a
и b
устанавливается значение None
.
Пример:
def func(a=None):
print(a)
func()
>>>None
Но если вы сделаете что-то вроде этого:
def func(a):
print(a)
func()
>>>TypeError: func() missing 1 required positional argument: 'a'
def __init__(self, p, a=None, b=None):
Эта строка определяет метод __init__
, который можно рассматривать как конструктор для класса. Это не вызов метода.
Установка a
и b
равными None
в определении метода делает None
их значением по умолчанию. Это делает их необязательными при вызове метода. (Таким образом, вы можете вызывать метод с 1, 2 или 3 параметрами.) Если вы не передадите значения для a
и b
, будет использовано None
. В Python принято использовать необязательные параметры вместо методов перегрузки.
Это синтаксис Python для значений по умолчанию или необязательного аргумента.
Аргументы, которые объявлены со значением по умолчанию, получат это значение по умолчанию, если они не переданы в вызове функции, и получат то, что передано в другом случае.
Здесь Arc(p)
совпадает с Arc(p, None, None)
, но вы можете использовать:
a1 = Arc(p)
a2 = Arc(p, a1)
, а затем a2.pprev
будет a1
.
Но есть некоторые оговорки с изменяемыми аргументами по умолчанию ... будьте осторожны с ними или лучше избегайте их, пока вы не станете более опытными в Python.