Смысл этих аргументов?

Я использую программу с карточками под названием Anki, написанную на Python. Я хочу написать свой первый аддон. Я новичок в Python. Я не технарь, но у меня есть несколько лет опыта работы с чужим кодом на Java, C++, C# и так далее.

На флэш-карте отображается вопрос, например «Столица Франции?». При нажатии кнопки «Показать ответ» Anki отображает ответ «Париж».

Я хочу захватить этот текст «Париж», прежде чем он будет показан.

Я пришел к этому моменту в коде Anki. В этот момент на карте отображается «Столица Франции?». Ответ по-прежнему пуст. Думаю, я хочу иметь возможность взять «val» (думаю, это «Paris») и использовать его в своем дополнении.

def _getTypedAnswer(self):
    self.web.evalWithCallback("typeans ? typeans.value : null", self._onTypedAnswer)

def _onTypedAnswer(self, val):
    self.typedAnswer = val        
    self._showAnswer()

Я гуглил, чтобы попытаться найти значение этого:

("typeans ? typeans.value : null", self._onTypedAnswer)

У меня есть доступ ко всему коду, и я могу предоставить любой код, который может быть полезен респондентам.

Спасибо.


Добавлено: после вопросов ответивших.

Anki можно запустить на компьютере или в Интернете. Все результаты изучения карточек синхронизируются, поэтому для конечного пользователя нет разницы между тем или иным методом.


Из класса "веб-просмотр":

def evalWithCallback(self, js, cb):
    self.page().runJavaScript(js, cb)

Класс «Рецензент» показывает вопросы и ответы. Окно рецензента — «mw» (от «главного окна»)

Вот оператор инициализации для класса «обозреватель»

def __init__(self, mw):
    self.mw = mw
    self.web = mw.web

person OldGrantonian    schedule 15.09.2016    source источник


Ответы (4)


typeans ? typeans.value : null - это C/C++/C# (и, возможно, Java тоже, не помню) код, эквивалентный (псевдокоду)

if typans:
   return typeans.value
else:
   return null

("typeans ? typeans.value : null", self._onTypedAnswer) — это кортеж, который содержит эту строку кода в виде строки.

person DeepSpace    schedule 15.09.2016
comment
В данном контексте это не кортеж, а список аргументов. - person BrenBarn; 15.09.2016
comment
эквивалент Python: a = typeans.value if typeans else None - person nonsensei; 15.09.2016
comment
@nonsensei или, возможно, даже a = getattr(typeans, 'value', None) в зависимости от варианта использования... - person Jon Clements♦; 15.09.2016

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

Если разрешено прямое манипулирование источником, вы можете назначить val в качестве атрибута другому объекту в методах, которые вы показали в вопросе.

Например:

def _onTypedAnswer(self, val):
    self.typedAnswer = val
    myobj.answer = val
    # or call a method on myobj to break flow
    # myobj.method(val)
    self._showAnswer()
person dodell    schedule 15.09.2016

self.web.evalWithCallback("typeans ? typeans.value : null", self._onTypedAnswer)

Это просто вызывает метод evalWithCallback с двумя аргументами: строкой "typeans ? typeans.value : null" и объектом метода self._onTypedAnswer. Вы можете увидеть, что evalWithCallback делает с этим, из вашего опубликованного кода:

def evalWithCallback(self, js, cb):
    self.page().runJavaScript(js, cb)

Итак, evalWithCallback берет строку и запускает ее как JavaScript. Из этого не ясно, как именно вызывается обратный вызов (например, с какими аргументами он будет вызываться), но суть того, что делает код, заключается в том, что он выполняет строку typeans ? typeans.value : null как JavaScript, а затем вызывает функцию self._onTypedAnswer. Я предполагаю, что аргумент val, переданный в _onTypedAnswer, будет результатом оценки выражения JS.

Кстати, судя по названию «печатный ответ», я бы предположил, что val — это не правильный ответ на вопрос, а предположение пользователя (т. е. значение, введенное пользователем).

person BrenBarn    schedule 15.09.2016

Кстати, точный (и действительный) эквивалент python для typeans? typeans.value : null:

typeans and typeans.value or None
person Andrei    schedule 15.09.2016
comment
Конструкция and/or более четко записывается как: typeans.value if typeans else None — Python не имеет null... - person Jon Clements♦; 15.09.2016
comment
Ты абсолютно прав. Просто скопировал null из предыдущего ответа - person Andrei; 28.02.2017