2016-09-15 18 views
4

Я использую программу флеш-карты Anki, которая написана на Python. Я хочу написать свое первое дополнение. Я новичок в Python. Я не специалист по технике, но у меня есть несколько лет опыта в прыжках внутри кода других людей на Java, C++, C# и т. Д.Смысл этих аргументов?

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

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

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

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 можно запускать на компьютере или в Интернете. Все результаты изучения карт синхронизируются, поэтому нет никакой разницы между одним или другим способом в отношении конечного пользователя.


Из класса "Webview":

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

"рецензент" класс показывает вопросы и ответы. Окно рецензент «МВТ» (для «главного окна»)

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

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

Это не синтаксис Python, но он называется «Ternary if» - см. Https://en.wikipedia.org/wiki/%3F: –

+1

Это, похоже, вызывает какой-то внешний язык, возможно, JavaScript (с учетом " web "в имени метода). Для Python '' typeans? Typeans.value: null "' является просто строкой; независимо от того, что использует его, поскольку код является чем-то вне Python. Что такое 'self.web'? У вас есть код 'evalWithCallback'? – BrenBarn

+0

Я думаю, что self._showAnswer() станет лучшим местом для вашего перехвата. TypedAnswer предлагает вам собирать ... набранный контент. Какой может быть не тот ответ, который появляется при нажатии кнопки, трудно сказать. – dodell

ответ

1

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

if typans: 
    return typeans.value 
else: 
    return null 

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

+3

Это не кортеж в этом контексте, это список аргументов. – BrenBarn

+0

эквивалент python: 'a = typeans.value, если typeans else None' – nonsensei

+1

@nonsensei или, возможно, даже' a = getattr (typeans, 'value', None) 'в зависимости от варианта использования ... –

0

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

Если разрешена прямая манипуляция с источником, вы можете назначить 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() 
0

BTW, точный (допустимый) питон эквивалент typeans? typeans.Значение: нуль является:

typeans and typeans.value or None 
+0

' and'/Конструкция 'или' более четко написана как: 'typeans.value, если typeans else None' - Python не имеет' null' ... –

+0

Вы абсолютно правы. Только что скопированный null из предыдущего ответа – Andrei

0
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 - это неправильный ответ на вопрос, а скорее угадание пользователя (т. Е. Значение, введенное пользователем).