estrarre parametri da una funzione

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

estrarre parametri da una funzione

Messaggioda maresama » martedì 10 luglio 2018, 11:33

Esempio input: 'aaaa(pa1, par2=par2, par3=(aaa,bbb), par4=[1,2,3,4])' (nb: stringa!)
out voluto:
xx= [par1,
par2=par2,
par3=(aaa,bbb),
par4=[1,2,3,4]
]
In pratica partendo da una riga di programma con una funzione, ottenere una lista con i parametri usati
Io l'ho risolto analizzando byte x byte (ovviamente non basta un semplice split della virgola)
ma mi chiedo se in Python c'è qualcosa che faccia già questo. (Io non sono riuscito a trovare
nulla, ma penso che ci sia).
Se esiste qualcosa, come si deve usare per ottenere quanto sopra?
grazie
maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda TommyB1992 » martedì 10 luglio 2018, 14:29

Devi scrivere un parser per includere tutte le casistiche che vuoi tu.
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 668
Iscrizione: luglio 2013
Desktop: GNU/Linux
Distribuzione: Ubuntu 15.04 (i686)
Sesso: Maschile

Re: estrarre parametri da una funzione

Messaggioda bancaldo » martedì 10 luglio 2018, 15:02

ma le stringhe, come formato, sono sempre le stesse?
In tal caso potresti usare anche le espressioni regolari.

Molto a grandi linee:

Codice: Seleziona tutto
>>> import re
>>> s =  'aaaa(pa1, par2=par2, par3=(aaa,bbb), par4=[1,2,3,4])'
>>> pattern = "\w+\((.+), par2=(.+), par3=(.+), par4=(.+)\)"
>>> xx = re.match(pattern, s).group(1)
>>> xx
'pa1'
>>> par2 = re.match(pattern, s).group(2)
>>> par2
'par2'
>>> par3 = re.match(pattern, s).group(3)
>>> par3
'(aaa,bbb)'
>>> par4 = re.match(pattern, s).group(4)
>>> par4
'[1,2,3,4]'
>>>
triplete!..."non vinciamo mai"...grazie Mou
Ubuntu User #27170  Linux User #489389
Avatar utente
bancaldo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2578
Iscrizione: aprile 2007
Località: Bologna

Re: estrarre parametri da una funzione

Messaggioda maresama » martedì 10 luglio 2018, 15:50

La stringa arriva dalla lettura di file sorgenti, quindi i modi i i contenuti cambiano ma ovviamente seguono le regole previste nello scrivere una funzione. Quindi un parametro può essere un nome, una stringa, una lista ecc.
Per il parser penso anche io che sia la soluzione, ma per quel poco che ho visto mi sembra che sia più complesso che scrivere un pezzo in python (come ho fatto)
Però il mio giudizio è che non avendolo mai fatto magari lo vedo complicato più di quanto lo sia.
Non ho trovato nessun esempio che mi risolva il mio problema e partendo da zero non so cosa usare e fare.
Ho guardato argparse ma ci ho capito poco....
maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda Actarus5 » martedì 10 luglio 2018, 16:23

Non sono un esperto di Python però da quel che so argparse serve per gestire i parametri da riga di comando, è un problema diverso da quello che hai tu.
Comunque per come è posto il problema anche io la penso come Tommy:

TommyB1992 Immagine ha scritto:Devi scrivere un parser per includere tutte le casistiche che vuoi tu.
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
Avatar utente
Actarus5
Prode Principiante
 
Messaggi: 180
Iscrizione: luglio 2013
Località: Abutalabashuneba
Desktop: Mate
Distribuzione: Fedora

Re: estrarre parametri da una funzione

Messaggioda bancaldo » martedì 10 luglio 2018, 17:17

Sono sorgenti python?
triplete!..."non vinciamo mai"...grazie Mou
Ubuntu User #27170  Linux User #489389
Avatar utente
bancaldo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2578
Iscrizione: aprile 2007
Località: Bologna

Re: estrarre parametri da una funzione

Messaggioda maresama » martedì 10 luglio 2018, 18:42

Certo. Sono sorgenti python (.py)
A parte che pensavo ci fosse qualche funzione python già predisposta. resta il fatto che argparse dice espressamente che è per riga di comando.
Ma in una riga di comando potrei avere lo stesso dei parametri da separare, quindi poteva essere non lo stesso problema ma simile.
Però come ho già detto, non ho capito bene....

Ma come si può fare per separare i parametri?
nb: come ho già detto ho risolto in altra maniera, ma mi interesserebbe molto vedere una alternativa (con parsing o altro modo)
maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda Actarus5 » martedì 10 luglio 2018, 20:51

Il fatto è che negli argomenti da riga di comando ci sono regole/convenzioni precise.
Prendi un programma eseguito in questo modo:

Codice: Seleziona tutto
rivalcfg --logo-color=#04ff00 --wheel-color=#04ff00


È facile farne il parsing perché quello che sta tra -- e = sono le opzioni e quello dopo = è il valore che ti interessa, peraltro gli argomenti sono separati da uno spazio... Ma per una funzione dove i parametri teoricamente potrebbero essere qualsiasi cosa con formati anche diversi? È un compito non banale, tra l'altro mostrare come hai risolto il problema potrebbe aiutare, per cui se ti va puoi postarlo.
Qualcosa che ci somiglia è questo ma come vedi non è esattamente ciò che vuoi fare tu.
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
Avatar utente
Actarus5
Prode Principiante
 
Messaggi: 180
Iscrizione: luglio 2013
Località: Abutalabashuneba
Desktop: Mate
Distribuzione: Fedora

Re: estrarre parametri da una funzione

Messaggioda maresama » martedì 10 luglio 2018, 22:08

D'accordo che è tutto più complesso.
Non riporto la mia soluzione perchè la funzione che ho fatto fa anche altro e confonderebbe, però dicendo i vari punti diventa forse comprensibile:

Quello che va fatto è suddividere la stringa ad ogni virgola, ma:
eventuali virgole comprese in un literal, in una stringa o in una tupla vanno ignorate.

analizzo la stringa dopo aver impostato un indicatore a '' :

- analizzo 1 carattere alla volta:
se il carattere è uguale all'indicatore, metto l'indicatore a '' (reset) e passo al carattere successivo
(l'indicatore serve per ignorare tutti i caratteri racchiusi tra [], [], '',"")
se è un inizio literal (" o ') lo memorizzo nell'indicatore
se è un inizio lista o tupla memorizzo ']' o ')' nell'indicatore (memorizzo quale carattere deve sbloccare nella ricerca della virgola)
e passo al carattere successivo

se non è uno di questi ed è ',' vuol dire che è finito il parametro e lo memorizzo in una lista con il risultato (alla fine accoderò l'ultimo)
torno a leggere il carattere successivo

Ovviamente all'inizio e ad ogni virgola memorizzo la posizione dell'inizio parametro

In pratica ad ogni inizio literal,lista o tupla imposto fino a quale carattere devo ignorare eventuali virgole, perciò se trovo una virgola è veramente quella di separazione dei parametri

Spero di essermi spiegato....
maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda melfnt » martedì 10 luglio 2018, 22:57

Sì, ti sei spiegato, ma non funziona per esempio se ci sono liste annidate come parametri o combinazioni di liste, tuple e stringhe costanti. Per esempio, non funziona con questa:
Codice: Seleziona tutto
f ( par1, par2=[[0],[1],[2]], par3="ciao[]", par4=5)


Dovresti tenerti uno stack di cose aperte ancora in attesa di carattere terminatore invece che un singolo indicatore.
Il problema del parsing è ben noto, se vuoi approfondire ti sei imbattuto nel caso del parsing di un linguaggio regolare (per esempio quello di stringhe separate da virgole) rispetto al parsing di un linguaggio libero (per esempio quello in cui devi tener conto del bilanciamento delle parentesi e degli altri caratteri). Maggiori informazioni qui, qui e qui.

Se vuoi scrivere un parser completo per un linguaggio regolare, ti consiglio di usare bison. È un bell'esercizio, piuttosto che scrivere tutto da capo.

Spero di essere stato utile :)
melfnt
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1275
Iscrizione: ottobre 2011

Re: estrarre parametri da una funzione

Messaggioda maresama » mercoledì 11 luglio 2018, 0:59

Domani proverò ma sono convinto che hai perfettamente ragione. (però mi pare di ricordare che io conto anche i riferimenti....devono tornare a 0.... comunque, se
riesco a trovare un po di tempo verifico.
Ma comunque la mia soluzione è poco accettabile perchè potrebbe non coprire tutta la casistica.
Per fortuna per ora non ho incontrato casi del genere e quindi non ho avuto problemi.
Però il dubbio di non aver previsto tutta la casistica l'avevo ed è il motivo per il quale volevo vedere se c'era una soluzione alternativa.
Mi sei stato utile sicuramente: almeno so cosa devo usare (o perlomeno tentare di usare!!)
grazie
maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda maresama » mercoledì 11 luglio 2018, 1:26

Ho voluto provare subito
La mia comunque funziona:

print out: tipo e lunghezza
<type 'list'> 4:

print ccon for:
par1
par2=[[0],[1],[2]]
par3="ciao[]"
par4=5

Ma vale quanto detto:
Potrebbe non funzionare in casi non previsti. (ad esempio io non prevedo che ci possano essere dizionari...)
Se riesco vedo quanto mi hai suggerito
maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda melfnt » mercoledì 11 luglio 2018, 9:24

maresama Immagine ha scritto:Ho voluto provare subito
La mia comunque funziona:

print out: tipo e lunghezza
<type 'list'> 4:

print ccon for:
par1
par2=[[0],[1],[2]]
par3="ciao[]"
par4=5

Ma vale quanto detto:
Potrebbe non funzionare in casi non previsti. (ad esempio io non prevedo che ci possano essere dizionari...)
Se riesco vedo quanto mi hai suggerito


Se funziona, meglio così. Però allora hai scritto uno pseudocodice troppo semplificato nel messaggio precedente. Infatti, con quello pseudocodice già par2 non avrebbe dovuto parsartelo correttamente: dopo la prima "[" avrebbe dovuto mettere il riferimento a "]". Poi, trovando la prossima "[" avrebbe dovuto rimettere il riferimento a "]", a quel punto la prima "]" fa erroneamente pensare al tuo programma che la lista sia finita, e quindi la prossima virgola viene interpretata come la fine del parametro.

Non so se mi sono spiegato, se funziona ci dev'essere qualcos'altro che non stiamo considerando. Se ti va posta proprio il codice :)
melfnt
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1275
Iscrizione: ottobre 2011

Re: estrarre parametri da una funzione

Messaggioda melfnt » mercoledì 11 luglio 2018, 9:39

maresama Immagine ha scritto:Domani proverò ma sono convinto che hai perfettamente ragione. (però mi pare di ricordare che io conto anche i riferimenti....devono tornare a 0.... comunque, se
riesco a trovare un po di tempo verifico.
Ma comunque la mia soluzione è poco accettabile perchè potrebbe non coprire tutta la casistica.
Per fortuna per ora non ho incontrato casi del genere e quindi non ho avuto problemi.
Però il dubbio di non aver previsto tutta la casistica l'avevo ed è il motivo per il quale volevo vedere se c'era una soluzione alternativa.
Mi sei stato utile sicuramente: almeno so cosa devo usare (o perlomeno tentare di usare!!)
grazie


Ho capito solo ora cosa intendi con "conto i riferimenti... devono tornare a 0".
In pratica tu hai tanti riferimenti, uno per le parentesi tonde, uno per le quadre e uno per gli apici, inizialmente tutti inizializati a zero. Ogni volta che trovi un carattere [, ( oppure ", aumenti il riferimento corrispondente. Ogni volta che trovi ],)," lo diminuisci. Le virgole le consideri solo se tutti e tre i riferimenti sono a zero.

Ok, in questo modo giustamente funziona, però nota tre cose:
1. in teoria questo algoritmo non dovrebbe funzionare per le stringhe, perché il delimitatore è lo stesso sia per la stringa aperta che per quella chiusa. Però funziona lo stesso perché in Python non ci possono essere stringhe annidate, quindi se hai "aperto" una stringa, il prossimo apice la "chiude" per forza.
2. Sempre in teoria, le parentesi potrebbero essere non correttamente bilanciate. Per esempio, il tuo algoritmo non funzionerebbe con questo:
Codice: Seleziona tutto
f ( par1, par2=[(1,], par3=(4,5,6)) )

e non si accorgerebbe che l'input non è sintassi Python corretta. Quindi, se vuoi parsare una strnga di un linguaggio libero per verificare il bilanciamento delle parentesi devi per forza usare lo stack. Se invece assumi che tutti gli input siano sintassi python corretta, allora ti basta contare quante volte apri e chiudi le cose come stai facendo ora.

3. (vale anche per le altre soluzioni): dovresti stare attento alle stringhe escapate e agli apici racchiusi dentro apici di altro tipo. Mi spiego meglio:
Codice: Seleziona tutto
f ( par1="questa è un apice \" escapato", par2=5)

il secondo apice non chiude la stringa, ma è solo un carattere apice dentro la stringa.

E poi (questo è un po' più subdolo):
Codice: Seleziona tutto
f (par1='stringa con " apici', par2=5)

In questo caso il tuo algoritmo non funziona neanche se consideri il carattere ' come separatore, ti serve per forza lo stack.

a margine: se i file che devi parsare sono sorgenti python corretti, magari si può fare qualcosa importandoli. Ora vedo un po' :)
melfnt
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1275
Iscrizione: ottobre 2011

Re: estrarre parametri da una funzione

Messaggioda melfnt » mercoledì 11 luglio 2018, 10:01

Scusa il triplo post: sì, si può fare da python direttamente. Questo:
Codice: Seleziona tutto
def foo ( a,b=5,c=7 ):
   return a+b+c

if __name__ == "__main__":
   print ("foo varnames: {}".format(foo.__code__.co_varnames))
   print ("foo defaults: {}".format(foo.__defaults__))


se eseguito con python 3.6 stampa
Codice: Seleziona tutto
foo varnames: ('a', 'b', 'c')
foo defaults: (5, 7)


Sapendo che i parametri di default devono essere per forza gli ultimi, da quell'output puoi dedurre che a non ha valore di default, b=5 e c=7. Quindi passare dall'output del mio codice al tuo è immediato.

Per quanto riguarda il fatto che la definizione delle funzioni che ti interessano è su un altro file, dovresti:
1. importare l'altro file come modulo
2. usare vars o simili sul modulo per individuare tutte le funzioni presenti
3. per ogni funzione trovata che non sia una di quelle di default di python, richiamare __code__.co_varnames e __defaults__

In bocca al lupo :)
melfnt
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1275
Iscrizione: ottobre 2011

Re: estrarre parametri da una funzione

Messaggioda maresama » mercoledì 11 luglio 2018, 10:53

Hai sempre ragione (complimenti: sei molto bravo e competente!)
In effetti la mia funzione non risolve tutti i casi da te indicati (ma qualcuno si)

Anche se controvoglia riporto il codice.
Controvoglia perchè la funzione non è fatta solo per estrarre i parametri da una funzione: è più generica e quindi può risultare fuorviante.
La funzione è fatta per separare da qualungue stringa gli elementi in base ad uno o più separatori (es: ',', ';', ':' ecc)
E prevede delle opzioni, che ora per semplificare ho rimosso (e questa è la mia paura: a volte restano involontariamente dei pezzi incomprensibili!)
E parte dal principio che dal punto di vista Python la stringa sia corretta

Comunque, per la prova, tieni presente:
1 - l'input è solo la stringa compresa tra () e non la funzione
2 - il risultato della funzione modificata è un po diverso: dopo il parametro c'è æ (altGr + a) e la virgola (tranne l'ultimo)
Questo perchè, prevedendo la separazione per uno o più separatori, è importante sapere qual'era il separatore trovato

Purtroppo devo uscire e non ho il tempo per vedere bene i tuoi messaggi
Lo farò appena posso
Grazie per il tuo contributo (prezioso!)
Ciao


Codice: Seleziona tutto

def SPLITM(rg,sep=None,nn=0,lit='vw',comm=1):
#    rg    : riga da splittare
#    sep   : lista con campi x split (1 o più caratteri = separatori)    es: [";",":"]
#            nb: se [] può essere usata per separare la parte commento nella riga
#    lit   : se <> "": ogni area racchiusa tra 1 dei caratteri speciali indicati non è esaminata per lo split (consid.literal)
#            nb: in lit oltre a caratteri speciali, per comodità si possono anche usare  v per ', w per "
#                se sono [ o ( l'altro è automaticamente considerato ] e )
#    comm  : se <> 0: se riga con commenti, il commento viene ignorato nello split
# << out   : lista blocchi. Ogni blocco è formato da:  'caratteri'+'æ'+separatore trovato     nb: 'æ' = AltGr+'a' lungo 2
#            se riga non termina con un separatore, ultimo blocco in out sarà solo :  'caratteri'
#-----
    if sep==None: sep=[]
    lit=lit.replace('v',"'"); lit=lit.replace('w','"')
    blo=comme=''; up=n=0; out=[]
    ctq=ctt=0
    while n < len(rg):
        x=rg[n:n+1]; n+=1
        if blo<>'':
           if x=="[": ctq+=1
           if x=="(": ctt+=1
           if x=="]": ctq-=1
           if x==")": ctt-=1
           if blo==x:
              if x=="]":
                 if ctq==0: blo=""
              elif x==")":
                 if ctt==0: blo=""
              else: blo=""
           continue
        if comm<>0 and x=='#': n-=1; comme=rg[n:]; rg=rg[0:n]; break
        if x in lit:
           blo=x;
           if x=="[": ctq+=1; blo="]"
           if x=="(": ctt+=1; blo=")"
           continue
        for se in sep:
           ll=len(se)-1
           if rg[n-1:n+ll]==se:
              piu=""
              piu+="æ"
              piu+=se
              out.append(rg[up:n-1]+piu); up=n+ll; n+=ll; continue
    out.append(rg[up:])
    return out
#################### > 012 +    207584 +    359360 #################### SPLITM



xx='par1, par2=[[0],[1],[2]], par3="ciao[]", par4=5'

qq=SPLITM(xx,sep=[","],lit="(["+'"')

print xx
print type(qq),len(qq)
for x in qq:    print x

maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda melfnt » mercoledì 11 luglio 2018, 15:16

maresama Immagine ha scritto:Hai sempre ragione (complimenti: sei molto bravo e competente!)
In effetti la mia funzione non risolve tutti i casi da te indicati (ma qualcuno si)

Anche se controvoglia riporto il codice.
Controvoglia perchè la funzione non è fatta solo per estrarre i parametri da una funzione: è più generica e quindi può risultare fuorviante.
La funzione è fatta per separare da qualungue stringa gli elementi in base ad uno o più separatori (es: ',', ';', ':' ecc)
E prevede delle opzioni, che ora per semplificare ho rimosso (e questa è la mia paura: a volte restano involontariamente dei pezzi incomprensibili!)
E parte dal principio che dal punto di vista Python la stringa sia corretta


Ti capisco, per la prossima volta ti consiglio di postare un minimal complete, verified example che si focalizzi sul problema, anche se in questo caso mi rendo conto che il tuo codice è difficile da semplificare. Il link è di stackoverflow, ma il concetto è quello.

Nel tuo caso avrei fatto da zero una funzione simile che lavora su un solo separatore e che non tenga conto dei commenti e avrei postato quella.

Comunque, per la prova, tieni presente:
1 - l'input è solo la stringa compresa tra () e non la funzione
2 - il risultato della funzione modificata è un po diverso: dopo il parametro c'è æ (altGr + a) e la virgola (tranne l'ultimo)
Questo perchè, prevedendo la separazione per uno o più separatori, è importante sapere qual'era il separatore trovato

Purtroppo devo uscire e non ho il tempo per vedere bene i tuoi messaggi
Lo farò appena posso
Grazie per il tuo contributo (prezioso!)
Ciao


Codice: Seleziona tutto

def SPLITM(rg,sep=None,nn=0,lit='vw',comm=1):
#    rg    : riga da splittare
#    sep   : lista con campi x split (1 o più caratteri = separatori)    es: [";",":"]
#            nb: se [] può essere usata per separare la parte commento nella riga
#    lit   : se <> "": ogni area racchiusa tra 1 dei caratteri speciali indicati non è esaminata per lo split (consid.literal)
#            nb: in lit oltre a caratteri speciali, per comodità si possono anche usare  v per ', w per "
#                se sono [ o ( l'altro è automaticamente considerato ] e )
#    comm  : se <> 0: se riga con commenti, il commento viene ignorato nello split
# << out   : lista blocchi. Ogni blocco è formato da:  'caratteri'+'æ'+separatore trovato     nb: 'æ' = AltGr+'a' lungo 2
#            se riga non termina con un separatore, ultimo blocco in out sarà solo :  'caratteri'
#-----
    if sep==None: sep=[]
    lit=lit.replace('v',"'"); lit=lit.replace('w','"')
    blo=comme=''; up=n=0; out=[]
    ctq=ctt=0
    while n < len(rg):
        x=rg[n:n+1]; n+=1
        if blo<>'':
           if x=="[": ctq+=1
           if x=="(": ctt+=1
           if x=="]": ctq-=1
           if x==")": ctt-=1
           if blo==x:
              if x=="]":
                 if ctq==0: blo=""
              elif x==")":
                 if ctt==0: blo=""
              else: blo=""
           continue
        if comm<>0 and x=='#': n-=1; comme=rg[n:]; rg=rg[0:n]; break
        if x in lit:
           blo=x;
           if x=="[": ctq+=1; blo="]"
           if x=="(": ctt+=1; blo=")"
           continue
        for se in sep:
           ll=len(se)-1
           if rg[n-1:n+ll]==se:
              piu=""
              piu+="æ"
              piu+=se
              out.append(rg[up:n-1]+piu); up=n+ll; n+=ll; continue
    out.append(rg[up:])
    return out
#################### > 012 +    207584 +    359360 #################### SPLITM



xx='par1, par2=[[0],[1],[2]], par3="ciao[]", par4=5'

qq=SPLITM(xx,sep=[","],lit="(["+'"')

print xx
print type(qq),len(qq)
for x in qq:    print x



Per restituire l'elenco dei parametri e il loro valore di default potresti restituire una lista di tuple oppure due liste parallele, invece che una sola lista con un separatore strano.

Premettendo che è moltissimo tempo che ormai non mi occupo più di queste cose, dopo se ho tempo posto la mia soluzione che usa il parsing con uno stack e controlla anche che i vari tipi di parentesi siano bilanciate. Tu intanto puoi provare a farlo da python direttamente usando __code__.co_varnames e __defaults__
melfnt
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1275
Iscrizione: ottobre 2011

Re: estrarre parametri da una funzione

Messaggioda maresama » mercoledì 11 luglio 2018, 17:33

Come ti avevo detto la funzione è per diversi usi e quella che ti ho dato è una riduzione e adattamento (cosa che non volevo fare)
La funzione completa usa æ solo su richiesta e per un motivo ben preciso che non sto a spiegare (es: ricostruzione riga originale dopo cambiamenti di parametri, con un semplice replace e join). E' comunque prevista anche la possibilità di una lista abbinata
La prova l'ho fatta con æ per evidenziare la necessità di sapere quale separatore c'era, problema che nasce dalla possibilità di averne più di uno
In sintesi la funzione è adatta ad analizzare righe di programma di tutti i tipi, comprese le funzioni.

Chiedo scusa: Nella prova che ho messo ho dimenticato di mettere ' in lit - in lit ci deve essere [('"

Ho fatto tutte le prove che hai indicato
il malfunzionamento c'è solo nel caso di \"
in tutti gli altri casi a me risulta che funziona sempre correttamente

Grazie nuovamente per l'aiuto
Ciao
maresama
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1528
Iscrizione: gennaio 2008

Re: estrarre parametri da una funzione

Messaggioda rai » mercoledì 11 luglio 2018, 18:22

Scusatemi se intervengo tardi e senza leggere tutti i post fin dall'inizio, quindi forse quello che scrivo è superato.
Volevo ricordare il modulo inspect che dovrebbe essere la cosa più robusta da usare, se non lo avete escluso per qualche motivo. Per esempio:
Codice: Seleziona tutto
>>> import inspect
>>> def func(a, b='AGCT"AACG', c=[True, False, (1,2)], d=({1:"un\"o"},[]), *args, **kwargs): pass

>>> signature = inspect.signature(func)
>>> for k, v in signature.parameters.items():
   print (v)

   
a
b='AGCT"AACG'
c=[True, False, (1, 2)]
d=({1: 'un"o'}, [])
*args
**kwargs
>>> 

per Python 2.x si usava il metodo inspect.getargspec(func) che funzionava in modo diverso e ora dovrei andare a guardarmelo
rai
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 2113
Iscrizione: maggio 2008
Località: Palermo
Distribuzione: 16.04

Re: estrarre parametri da una funzione

Messaggioda TommyB1992 » mercoledì 11 luglio 2018, 19:44

+1

direi che meglio di così si muore
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 668
Iscrizione: luglio 2013
Desktop: GNU/Linux
Distribuzione: Ubuntu 15.04 (i686)
Sesso: Maschile

Successiva

Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 22 ospiti