Python: как предотвратить переменную класса, которая является функцией для понимания как метод? - PullRequest
0 голосов
/ 17 сентября 2010

В настоящее время я реализую приложение django, для этого я пытаюсь использовать синтаксис, который согласуется с Django ...

Итак, вот что я пытаюсь:

class Blablabla(Model):

    #this contains Blablabla's options
    class Meta:
        sort_key = lambda e: e

sort_key - ключевая функция (для целей сортировки), но, конечно, ее понимают как метод Meta (что совершенно не то, что я хочу) !!!

Какой-нибудь обходной путь, который все еще позволил бы мне использовать этот синтаксис?

РЕДАКТИРОВАТЬ: Просто важная точность ... код, который я написал, должен быть написан кем-то, кто использует библиотеку! Вот почему я не хочу никаких подвохов. И да, в Django он действительно используется только для опций ... конечно, Meta - это класс, но я говорю: «он не рассматривается как класс», потому что он не используется как класс: вы его не создаете, вы не помещаете методы класса, только атрибуты класса ... У Model есть метакласс, который извлекает все из этого Meta и обрабатывает все объявленные опции ... Но это все! Это просто заполнитель для опций.

Но хорошо, это правда. Я никогда не видел опцию, которая является функцией в Django ... Поэтому я буду следовать Нед и объявлять эту функцию сортировки как метод Model, который должен быть переопределен ...

Ответы [ 4 ]

2 голосов
/ 17 сентября 2010

Почему вы пытаетесь поместить sort_key в Meta?Meta используется для опций Django, это не место для собственных методов.Модели могут иметь методы, определенные на них.Я думаю, вы хотите что-то простое, как:

class Blablabla(Model):

    def sort_key(self, e):
        return e
2 голосов
/ 17 сентября 2010

В общем

class Meta(object):
    sort_key= staticmethod(lambda e: e)

Понятия не имею, справится ли магия, в которой Джанго пересаживает членов "мета", с такими методами, как это, нормально, но я не вижу никакой внутренней причины, почему нет.

0 голосов
/ 17 сентября 2010

Разве вы не можете просто создать простой модуль (meta?) И добавить к нему sort_key? Тогда иди и include это где вам нужно ...

0 голосов
/ 17 сентября 2010

ОП пишет в комментарии: «Мета не должна рассматриваться как класс». Если это так, то есть, если Django может выжить, когда Meta действительно , а не класс (очень большое «если»), тогда возможно удовлетворить действительно странное желание ОП избежать самого простого решение (просто обернуть stqticfunction вокруг lambda в вопросе).

По сути, это требует написания (довольно странного) мета -класса, который генерирует объект, в котором поиск атрибутов обходит обычное использование классом объектов дескрипторов (каждая функция является объектом дескриптора : то есть у него есть метод __get__, который Python обычно использует при поиске атрибута в классе или его экземпляре).

Общая идея этого абсурдного движения была бы примерно такой ...:

class MetaNotAClass(type):
   def __new__(mcl, clasname, bases, clasdict):
     if bases:
         usedict = {}
     else:
         usedict = clasdict
     usedict['__foo'] = clasdict
     return type.__new__(mcl, clasname, bases, usedict)
   def __getattr__(cls, atname):
      try: return getattr(cls, '__foo')[atname]
      except KeyError: raise AttributeError, atname

class NotAClass:
  __metaclass__ = MetaNotAClass


class Bah(NotAClass):
  def f(): return 'weird!'

print Bah.f()

Конечно, все, что ожидает от Bah до , будет , класс сломается (но тогда вы действительно говорите, что "на самом деле это не должно рассматриваться как класс", так что это в основном то, что вы просите: сломать любой код, который считает, что означает «быть увиденным как класс»! -).

...