Dynamisch erstellte Methode und Dekorateur, bekam die Fehlermeldung 'functools.teilweise' Objekt hat kein Attribut '__module__'

Ich bin derzeit mit EndpointsModel zum erstellen einer RESTful API für alle meine Modelle auf der AppEngine. Da ist es Erholsam, diese api haben eine Menge wiederholen Sie die code, die ich vermeiden möchte.

Beispiel:

class Reducer(EndpointsModel):
    name = ndb.StringProperty(indexed=False)

@endpoints.api(
    name="bigdata",
    version="v1",
    description="""The BigData API""",
    allowed_client_ids=ALLOWED_CLIENT_IDS,
)
class BigDataApi(remote.Service):
    @Reducer.method(
        path="reducer",
        http_method="POST",
        name="reducer.insert",
        user_required=True,
    )
    def ReducerInsert(self, obj):
        pass

    ## and GET, POST, PUT, DELETE
    ## REPEATED for each model

Ich will, um Sie zu generisch. Also versuche ich die dynamische add-Methode der Klasse.
Was ich bisher versucht habe:

from functools import partial, wraps

def GenericInsert(self, obj, cls):
    obj.owner = endpoints.get_current_user()
    obj.put()
    return obj

# Ignore GenericDelete, GenericGet, GenericUpdate ...

import types
from functools import partial

def register_rest_api(api_server, endpoint_cls):
    name = endpoint_cls.__name__

    # create list method 
    query_method = types.MethodType(
    endpoint_cls.query_method(
        query_fields=('limit', 'pageToken'),
        path="%ss" % name,
        http_method="GET",
        name="%s.list" % name,
        user_required=True
    )(partial(GenericList, cls=endpoint_cls)))

    setattr(api_server, "%sList", query_method)

    # create insert method
    # ...

register_rest_api(BigDataApi, Reducer)

Aber ich habe 'functools.partial' object has no attribute '__module__' exception.
Ich denke, es ist, weil es einige Konflikte zwischen endpoints.method's Dekorateur und teilweise. Aber keine Ahnung, wie es zu vermeiden.

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 239, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 298, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 84, in LoadObject
    obj = __import__(path[0])
  File "/Users/Sylvia/gcdc2013/apis.py", line 795, in <module>
    register_rest_api(BigDataApi, Reducer)
  File "/Users/Sylvia/gcdc2013/apis.py", line 788, in register_rest_api
    )(partial(GenericList, cls=endpoint_cls)))
  File "/Users/Sylvia/gcdc2013/endpoints_proto_datastore/ndb/model.py", line 1544, in RequestToQueryDecorator
    @functools.wraps(api_method)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", line 33, in update_wrapper
    setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'functools.partial' object has no attribute '__module__'

Verwandte Artikel:

  • Diese Frage könnte viel kürzer sein, indem Sie erklären, das Problem für nur GenericInsert zum Beispiel.
  • Ohne den Blick zu eng, es scheint, dass, wenn Sie Probleme mit Namenskonflikten dann from functools import partial -> import functools oder sogar from functools import partial as part oder sowas funktionieren könnte.
  • Der Kern des Problems ist, dass functools.wraps (die Endpunkte code, aber nicht in einer Weise, die in irgendeiner Weise falsch oder ungewöhnlich) erwartet callable wird gewickelt, um eine __module__ attribute (unter anderem). Die Methode, die Sie vorbei es hat Sie nicht. bugs.python.org/issue3445 schlägt dies wurde als fix-Wert für python 3.3, aber nicht für die 2.7. So werden Sie wahrscheinlich nur brauchen, um die Dinge anders... nicht viel von einer Antwort, sorry.
  • Danke, der link ist sehr hilfreich zu erklären, die Probleme
  • Welche anderen Wege würden Sie vorschlagen, zu beheben Argumente für eine Funktion?
InformationsquelleAutor lucemia | 2013-12-15
Schreibe einen Kommentar