Итак, я абсолютный новичок, изучающий Python 3 менее 2 недель. Однако я действительно считаю, что многому научился за последние 2 недели.

Моя текущая цель — подключиться к IG API для создания приложения для автоматической торговли.

До сих пор мне удалось пройти аутентификацию и получить несколько токенов для подключения к их API.

Однако их Streaming API, который производит текущие цены, осуществляется через сервер под названием Lightstreamer. Мне удалось подключиться к их серверу и создать сеанс, используя библиотеку запросов.

Проблема сейчас заключается в том, чтобы распечатать данные/значение из ответа.

Во всяком случае, это то, что я понял, осмотревшись вокруг. Не могли бы вы, ребята, сказать мне, что делает этот блок кода? конкретно переменная за переменной, функция за функцией, значение за значением.

session_id = None
control_link = None
streaming_i = streaming_i.iter_lines(chunk_size=80, decode_unicode=True)

for line in streaming_i:
    print("line", line)
    if ":" not in line:
        continue
    [param, value] = line.split(":", 1)
    if param == "SessionId":
        session_id = value
    if param == "ControlAddress":
        control_link = value
    if session_id and control_link:
        break

Конкретно этот код

[param, value] = line.split(":", 1)
0
Tuyen Khong 19 Окт 2019 в 16:16

1 ответ

Похоже, этот код просто пытается установить две управляющие переменные, читая поток текста, который выглядит как

key1:value1
key2:value2
key3:value3
...

Сначала он проверяет, содержит ли строка двоеточие, затем разбивает строку на ключ и значение на основе этого двоеточия и, наконец, проверяет, относится ли ключ к нам, заполняя соответствующую управляющую переменную, которую мы пытаемся найти. Это продолжается для каждой строки до тех пор, пока не будут установлены обе управляющие переменные.

# initialize variables we'll want to use later
session_id = None
control_link = None
# get an iterator through this stream
streaming_i = streaming_i.iter_lines(chunk_size=80, decode_unicode=True)

# iterate through each line of that iterator
for line in streaming_i:
    print("line", line)                  # print what the line looks lik3
    if ":" not in line:                  # if the line does not contain a ':', 
        continue                         #    then skip it
    [param, value] = line.split(":", 1)  # see below
    if param == "SessionId":             # determine what the parameter is,
        session_id = value               #    and set the appropriate control variable
    if param == "ControlAddress":
        control_link = value
    if session_id and control_link:      # once we've read enough lines to set both control variables,
        break                            #    we stop reading

Что касается строки, которая вас смущает, это просто множественное присваивание:

a, b = 1, 2

str.split() возвращает список подстрок, которые вы получаете, разбивая данную строку на заданный символ-разделитель. В этом случае предоставляется необязательный аргумент maxsplit, который указывает, сколько разделителей следует учитывать. Итак, здесь он останавливается только после первого разделителя :.

Таким образом, как указано, line.split(":", 1) всегда будет возвращать 2-кортеж. Используемый здесь синтаксис просто присваивает первому значению в этом кортеже 2 значение param, а второе значение в нем — value. Квадратные скобки вокруг param, value совершенно бесполезны и могут быть удалены - возможно, они предназначены для того, чтобы было более понятно, что возвращаемые значения из line.split(...) присваиваются соответствующим переменным. , но это приводит к большей путанице, чем просто их отсутствие. Обычно вы должны использовать для этого () вместо [].


Если вы когда-нибудь запутались в том, что делает функция, вы можете запустить консоль Python и ввести команду help(function). В этом случае вы знаете, что line — это строка, поэтому вы вставляете help(str.split), и вы видите документацию для метода split():

split(self, /, sep=None, maxsplit=-1)
    Return a list of the words in the string, using sep as the delimiter string.

    sep
      The delimiter according which to split the string.
      None (the default value) means split according to any whitespace,
      and discard empty strings from the result.
    maxsplit
      Maximum number of splits to do.
      -1 (the default value) means no limit.
0
Green Cloak Guy 19 Окт 2019 в 16:38
Спасибо большое, я смутно понимаю. Хотя я бы не смог объяснить это себе так ясно, как вы, и поэтому это действительно помогло!
 – 
Tuyen Khong
22 Окт 2019 в 17:33