3.3. type, str, dir, ed altre funzioni built-in

Python ha un piccolo insieme di funzioni built-in estremamente utili. Tutte le altre funzioni sono suddivise in moduli. Si tratta di una decisione coscienziosa, per preservare il nucleo del linguaggio dall'essere soffocato come in moltri altri linguaggi di script (coff coff,Visual Basic).

La funzione type restituisce il tipo di dato di ogni oggetto arbitrario. I tipi possibili sono elencati nel modulo types. È utile per le funzioni helper che possono gestire diversi tipi di dati.

Esempio 3.6. Introduzione a type

>>> type(1)           1
<type 'int'>
>>> li = []
>>> type(li)          2
<type 'list'>
>>> import odbchelper
>>> type(odbchelper)  3
<type 'module'>
>>> import types      4
>>> type(odbchelper) == types.ModuleType
1
1 type prende qualunque cosa in ingresso e ne ritorna il suo tipo. E voglio proprio dire qualunque cosa. Interi, stringhe, liste, dizionari, tuple, funzioni, classi, moduli ed anche tipi.
2 type può prendere una variabile e ritornare il suo tipo.
3 type funziona anche sui moduli.
4 Puoi usare le costanti nel modulo types per confrontare i tipi degli oggetti. Questo è ciò che fa la funzione help, come vedremo brevemente.

La funzione str forza i dati in una stringa. Qualunque tipo di dato può essere forzato ad essere una stringa.

Esempio 3.7. Introduzione a str

>>> str(1)          1
'1'
>>> horsemen = ['war', 'pestilence', 'famine']
>>> horsemen.append('Powerbuilder')
>>> str(horsemen)   2
"['war', 'pestilence', 'famine', 'Powerbuilder']"
>>> str(odbchelper) 3
"<module 'odbchelper' from 'c:\\docbook\\dip\\py\\odbchelper.py'>"
>>> str(None)       4
'None'
1 Per semplici tipi di dati come gli interi, vi aspettereste che str funzioni, perché quasi ogni linguaggio ha una funzione per convertire un intero in una stringa.
2 Ad ogni modo, str funziona su ogni oggetto di ogni tipo. Qui è al lavoro su una lista che abbiamo costruito un po' alla volta.
3 str funziona anche sui moduli. Notate che la rappresentazione in stringa del modulo, include il percorso del modulo su disco, quindi i vostri risultati saranno differenti.
4 Un sottile ma importante comportamento di str è che funziona anche su None, il valore nullo in Python. Ritorna la stringa 'None'. Lo useremo a nostro vantaggio nella funzione help, come vedremo brevemente.

Il cuore della nostra funzione help è la potente funzione dir. dir ritorna una lista di attributi e metodi di ogni oggetto: moduli, funzioni, stringhe, liste, dizionari... praticamente qualunque cosa.

Esempio 3.8. Introduzione a dir

>>> li = []
>>> dir(li)           1
['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> d = {}
>>> dir(d)            2
['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values']
>>> import odbchelper
>>> dir(odbchelper)   3
['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']
1 li è una lista, quindi dir(li) ritorna una lista di tutti i metodi di una lista. Notate che la lista ritornata contiene i nome dei metodi sotto forma di stringhe, non come veri e propri metodi.
2 d è un dizionario, quindi dir(d) ritorna una lista dei nomi dei metodi di un dizionario. Come minimo uno di questi, keys, dovrebbe suonarvi familiare.
3 Qui comincia a farsi interessante. odbchelper è un modulo, quindi dir(odbchelper) ritorna una lista con ogni genere di cose definite nel modulo, inclusi gli attributi built-in, come __name__ e __doc__ e qualunque altro attributo e metodo voi definiate. In questo caso, odbchelper ha solamente un metodo definito dall'utente, la funzione buildConnectionString che abbiamo studiato nella sezione Conoscere Python.

Infine, la funzione callable (invocabile ndr) prende ogni tipo di oggetto e ritorna 1 se l'oggetto può essere invocato, 0 in caso contrario. Gli oggetti invocabili includono funzioni, metodi di classi ed anche le classi stesse. (Ulteriori informazioni sulle classi nel capitolo 4).

Esempio 3.9. Introduzione a callable

>>> import string
>>> string.punctuation           1



'!""#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~'
>>> string.join                  2
<function join at 00C55A7C>
>>> callable(string.punctuation) 3
0
>>> callable(string.join)        4
1
>>> print string.join.__doc__    5
join(list [,sep]) -> string

    Return a string composed of the words in list, with
    intervening occurrences of sep.  The default separator is a
    single space.

    (joinfields and join are synonymous)
1 Le funzioni nel modulo string sono deprecate (per quanto un sacco di persone continuino ad usare la funzione join), ma il modulo contiene molte costanti utili come string.punctuation, che contiene tutti i caratteri di punteggiatura standard.
2 string.join è una funzione che concatena una lista di stringhe.
3 string.punctuation non è invocabile; è una stringa. (Una stringa ha dei metodi invocabili, ma la stringa stessa non è affatto invocabile.)
4 string.join è invocabile; è una funzione che prende due argomenti.
5 Ogni oggetto invocabile può avere una stringa di documentazione. Usando la funzione callable su ognuno degli attributi di un oggetto, possiamo determinare quali attributi ci interessano (metodi, funzioni, classi) e quali vogliamo ignorare (costanti, etc.), senza sapere nulla in anticipo a proposito dell'oggetto.

type, str, dir e tutto il resto delle funzioni built-in di Python sono raggruppate in un modulo speciale chiamato __builtin__. (Cioè con due sottolineature prima e dopo.) Se vi può aiutare, potete pensare che Python automaticamente esegua from __builtin__ import * all'avvio, comando che importa tutte le funzioni “built-in” nello spazio dei nomi locale, così che possiate usarle direttamente.

Il vantaggio di vederla in questo modo sta nel fatto che potete accedere a tutte le funzioni ed agli attributi built-in sotto forma di gruppo, ricavando le informazioni dal modulo __builtin__. Indovinate, abbiamo una funzione per fare questo, è chiamata help. Provate voi stessi e scorrete la lista; ci immergeremo in alcune delle funzioni più importanti più tardi. (Alcune delle classi di errore built-in, come AttributeError, dovrebbero già suonarvi familiari.)

Esempio 3.10. Attributi e funzioni built-in

>>> from apihelper import help
>>> import __builtin__
>>> help(__builtin__, 20)
ArithmeticError      Base class for arithmetic errors.
AssertionError       Assertion failed.
AttributeError       Attribute not found.
EOFError             Read beyond end of file.
EnvironmentError     Base class for I/O related errors.
Exception            Common base class for all exceptions.
FloatingPointError   Floating point operation failed.
IOError              I/O operation failed.

[...snip...]
Nota
Python è dotato di un eccellente manuale di riferimento, che dovreste usare spesso per conoscere tutti i moduli che Python ha da offrire. Ma mentre nella maggior parte dei linguaggi vi ritroverete a dover tornare spesso sul manuale (o pagine man o ... Dio vi aiuti, MSDN) per ricordare come si usano questi moduli, Python è largamente auto-documentante.

Ulteriori letture