класс python float не отображается в иерархии классов, если его не «подталкивать»

#python #class #floating-point #hierarchy #lazy-evaluation

#python #класс #с плавающей запятой #иерархия #отложенная оценка

Вопрос:

Если я использую эту функцию для распечатки иерархии классов python, по какой-то причине тип «float» не отображается в выходных данных.

 def printHier(cls, indent = 0, tab = "  "):

    print "%s%s" % (tab*indent, cls.__name__)

    try:
        subclasses = cls.__subclasses__()
    except TypeError:
        subclasses = cls.__subclasses__(cls)

    subclasses.sort(key = lambda v: v.__name__)

    for subcls in subclasses:
        printHier(subcls, indent = indent   1)

printHier(object)
  

Если я определю эту дополнительную функцию (ниже) и вызову ее перед вызовом первой, то появится float. Кто-нибудь может объяснить это странное поведение? Есть ли что-то ленивое в некоторых классах python? Мне интересно, могут ли отсутствовать некоторые другие классы.

 def tweak(cls):
    """
     for some reason "float" doesn't show up in hierarchy unless
     we "prod" it...
    """
    superclasses = cls.__mro__

tweak(float)
  

Комментарии:

1. Какая у вас версия Python? Ваш код показывает float на 2.7 и 2.6.

2. Python 2.6.1 (r261: 67515, июнь 24 2010, 21:47:49) [ GCC 4.2.1 (Apple Inc., сборка 5646)] на darwin

3. У меня также есть сборка 2.6.4. Когда я использую это, я получаю float без подталкивания и десятки других, которые не отображались в 2.6.1. Вот неполный список: многоточие в коде, перечисление экземпляра генератора фреймов, статический метод обратного среза, супер трассировка xrange

4. Моя версия 2.6.4, поэтому я предполагаю, что это поведение (ошибка?) было изменено между версиями.

5. Подтверждено — я только что протестировал с Mac версии v2.6.1, и float отсутствует. Работает на Ubuntu 2.6.6, Mac 2.6.6 и 2.7.1.

Ответ №1:

Похоже, это проблема с Python 2.6.1. float отображается на моих установках (2.6.4 и 2.7, оба в Windows) и на других более новых версиях, протестированных Jay и samplebias.

Я искал что-то релевантное в журнале изменений CPython, но я не смог найти ничего, что, по-видимому, связано.