2016-09-15 39 views
4

我使用名爲Anki的flashcard程序,它是用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 
+0

這不是Python語法,但它被稱爲「三元如果」 - 請參閱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 : nullC/C++/C#(可能的Java也記不清了)代碼初始化語句相當於(僞代碼)

if typans: 
    return typeans.value 
else: 
    return null 

("typeans ? typeans.value : null", self._onTypedAnswer)是包含這行代碼作爲字符串的元組。

+3

在這種情況下它不是一個元組,它是一個參數列表。 – BrenBarn

+0

python等價物是:'a = typeans.value if 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 if 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。我的猜測是傳遞給_onTypedAnswerval參數將是評估JS表達式的結果。

順便說一下,從名稱「typed answer」來判斷,我猜想val不是問題的正確答案,而是用戶的猜測(即用戶輸入的值)。