Frage

Wie funktioniert dieses Import Arbeit, welche Datei verwendet es?

import _functools

In Python 2.5:

import _functools
print _functools.__file__

Gibt:

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__'

Wie kann ich die Bedeutung von Teil bekommen (von _functools Teil importieren), wenn ich C-Code nicht lesen können?

War es hilfreich?

Lösung

C-codierter Module eingebaut (fehlt __file__) oder lebt in einer .so oder .pyd dynamischen Bibliothek (die ihre __file__ zeigen an.) - das ist ein Implementierungsdetail, dass Sie sollten über nicht kümmern

Wenn Sie verstehen wollen, wie ein Python-aufrufbar, Funktion Werke-C codiert durch Code studieren, lernen zu lesen C ist im Allgemeinen am besten (weit weniger hart als tatsächlich produktiv Codierung in C ;-). Doch oft werden Sie (suggestiv, nicht-autoritative) "Probe Python-Implementierungen" von C-codierter Funktionalität finden, und Sie können studieren diejenigen .

Ein besonders fruchtbare Repository Python codierter Äquivalente Python Standardbibliothek Funktionalität, die normalerweise in C codiert ist, ist die PyPy Projekt (das tut Python-Implementierungen codiert in Python) - seine Quellen sind browseable hier und natürlich können Sie herunterladen und peruse sie auf Ihrem Computer.

Dies ist insbesondere dann PyPy _functools.py Umsetzung:

""" 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)

Pretty trivial zu lesen und zu verstehen, hoffe ich!

Andere Tipps

Sie mehr klar sein, wenn Fragen beim nächsten Mal zu fragen. Ich nehme an, Sie wollen dieses

>>> import _functools
>>> _functools.__file__
'/usr/lib/python2.6/lib-dynload/_functools.so'

Es ist ein gemeinsam genutztes Objekt _functools.so, geschrieben in C. Ich denke, wird es durch den tatsächlichen functools Modul importiert. Warum versuchen Sie es zu importieren? Sicher, es ist jedoch möglich, können Sie genauso gut from functools import partial.

Für python2.6, Das _functools Modul ist ein builtin. Sie können sehen, dass, wenn Sie einfach import _functools ; repr(_functools) ein und drücken prompt in Ihrem Dolmetscher ein.

Wenn Sie die C-Quelle des Moduls sehen möchten, überprüfen http://hg.python.org/cpython/file/d7e85ddb1336/Modules/_functoolsmodule.c

Dieses _functools Modul keinen __file__ Attribut hat (siehe nächsten Absatz), da es in den Interpreter kompiliert.

Für python2.5, Das _functools Modul ist ein Standard-Bibliotheksmodul in C durchgeführt und ist erhältlich unter http : //hg.python.org/cpython/file/a78381ead4cf/Modules/_functoolsmodule.c , wenn Sie es sehen wollen. Sie können den Ort sehen, von wo aus das Modul durch Eingabe import _functools ; print _functools.__file__ an Ihrem Interpreter Prompt

geladen

Das Verhalten der functools.partial() Funktion wird in PEP 309 die es definiert. Die obwohl die tatsächlichen Implementierungen von Einbauten sind oft in C PEP einschließlich dieser in der Regel a href enthalten <= „http://www.python.org/dev/peps/pep-0309/#example-implementation“ rel =“ nofollow noreferrer "> Beispielimplementierungen in Python .

In diesem Beispiel Code sollte ausreichend sein, für Sie das Verhalten von functools.partial() zu verstehen. Wenn es eine spezifische Frage über die C-Implementierung, die Sie wird über gehen zu müssen, den C-Code zu lesen. Oder vielleicht beschreibt es in Ihrer Frage und könnte jemand die Antwort kennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top