2015-05-21 8 views
5

Trovo difficile formattare i numeri con Julia:julia @printf cambia la mia variabile

b = 1.111111 
bb = @printf "test : %5.2f" b 
bb 

test : 1.11 

che è bene.

using PyPlot 
annotate(@printf "test : %5.2f" b, xy=[1;1]) 

test : 
type: non-boolean (Array{Bool,1}) used in boolean context 
while loading In[16], in expression starting on line 2 

Che non capisco poiché mi aspetto che il risultato di @printf sia una stringa. Quindi, se qualcuno mi può spiegare come dovrei fare cosa sarebbe

"test : %5.2f" % b 

in Python.

E per concludere, ecco la cosa strana:

b 
1 

b è stato gettato in un Int. Lo chiameresti un bug?

uso Julia 0.3.2 con Jupyter 3.1

risposta

12

Macro analisi (in particolare nel contesto di una chiamata di funzione) è un po 'esigente. Si può vedere come Julia analizzato questo semplicemente citando esso:

julia> :(annotate(@printf "test : %5.2f" b, xy=[1;1])) 
:(annotate(@printf "test : %5.2f" (b,xy) = [1,1])) 

Come si può vedere, la macro è "avido" di argomenti di funzione. L'intera parte b, xy=[1;1] viene considerata come l'unico argomento della macro @printf. Questo spiega perché il valore di b cambia - il = ha cambiato i contesti dal denotare un argomento di parola chiave a un compito di tupla generale!

Mi consiglia di utilizzare la sintassi della funzione simile per le macro quando li utilizzano all'interno delle espressioni più complicate in questo modo:

annotate(@sprintf("test : %5.2f", b), xy=[1;1]) 

E, infine, notare che ho cambiato @printf-@sprintf. Il primo restituisce nothing e stampa semplicemente il valore, mentre il secondo restituisce una stringa che è possibile passare alle funzioni.

+0

grazie per la risposta e il trucco per vedere come Julia analizza una macro. – Olric

Problemi correlati