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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top