Domanda
Come funziona questa importazione, quale file utilizza?
import _functools
In Python 2.5:
import _functools
print _functools.__file__
Dà:
Traceback (most recent call last):
File "D:\zjm_code\mysite\zjmbooks\a.py", line 5, in <module>
print _functools.__file__
AttributeError: 'module' object has no attribute '__file__'
Come posso ottenere il significato di partial (da _functools import partial) se non riesco a leggere il codice C?
Soluzione
I moduli in codice C possono essere integrati (mancano __file__
) o vivere in a .so
O .pyd
libreria dinamica (che loro __file__
indicherà) - questo è un dettaglio di implementazione di cui non dovresti preoccuparti.
Se vuoi capire come funziona una funzione richiamabile in Python e codificata in C, studia il codice, impara a Leggere C è generalmente il migliore (molto meno difficile di quanto effettivamente produttivo codifica in C;-).Tuttavia, spesso troverai (suggestivi, non autorevoli) "esempi di implementazioni Python" di funzionalità in codice C e puoi studiare quelli.
Un repository particolarmente fruttuoso di equivalenti codificati in Python alle funzionalità della libreria standard Python che normalmente sono codificate in C è il pipi project (che esegue implementazioni Python codificate in Python) - i suoi sorgenti sono consultabili Qui e ovviamente puoi scaricarli ed esaminarli sul tuo computer.
In particolare, questo è quello di Pypy _functools.py implementazione:
""" Supplies the internal functions for functools.py in the standard library """
class partial:
"""
partial(func, *args, **keywords) - new function with partial application
of the given arguments and keywords.
"""
__slots__ = ['func', 'args', 'keywords']
def __init__(self, func, *args, **keywords):
if not callable(func):
raise TypeError("the first argument must be callable")
self.func = func
self.args = args
self.keywords = keywords
def __call__(self, *fargs, **fkeywords):
newkeywords = self.keywords.copy()
newkeywords.update(fkeywords)
return self.func(*(self.args + fargs), **newkeywords)
Abbastanza banale da leggere e capire, spero!
Altri suggerimenti
Si prega di essere più chiaro quando si fanno domande la prossima volta. Presumo che si desidera che questo
>>> import _functools
>>> _functools.__file__
'/usr/lib/python2.6/lib-dynload/_functools.so'
E 'un _functools.so
oggetto condiviso, scritto in C. Credo, è importato dal modulo functools
vero e proprio. Perché si sta tentando di importare da esso? Certo, è possibile, tuttavia, si può altrettanto bene from functools import partial
.
Per python2.6,
Il modulo _functools
è incorporato. Si può vedere che se è sufficiente digitare import _functools ; repr(_functools)
e premere Invio al prompt interprete.
Se volete vedere il sorgente C del modulo, controlla http://hg.python.org/cpython/file/d7e85ddb1336/Modules/_functoolsmodule.c
Questo modulo _functools
non ha un attributo __file__
(vedi paragrafo successivo) dal momento che è compilato nel interprete.
Per Python2.5,
Il modulo è un modulo _functools
libreria standard implementato in C ed è disponibile a http : //hg.python.org/cpython/file/a78381ead4cf/Modules/_functoolsmodule.c se si vuole vedere. Si può vedere la posizione da cui il modulo è caricato dalla import _functools ; print _functools.__file__
digitando al prompt interprete
Il comportamento della funzione functools.partial()
è descritta in PEP 309 che è stato definito. I anche se le implementazioni reali di built-in sono spesso in C PEP di compreso questo di solito contengono esempio implementazioni in Python .
Questo codice di esempio dovrebbe essere sufficiente per voi per capire il comportamento di functools.partial()
. Se c'è un problema specifico in merito all'attuazione C che è preoccupante che si sta andando ad avere per leggere il codice C. O forse descriverlo in tua domanda e qualcuno potrebbe conoscere la risposta.