Запись через точку стиля JavaScript для ключей словаря unpythonic?

Как правило, вы можете сравнить client[Height|Width] с scroll[Height|Width], чтобы обнаружить это ... но значения будут одинаковыми при видимости переполнения. Таким образом, для этой процедуры необходимо учитывать процедуру обнаружения:

// Determines if the passed element is overflowing its bounds,
// either vertically or horizontally.
// Will temporarily modify the "overflow" style to detect this
// if necessary.
function checkOverflow(el)
{
   var curOverflow = el.style.overflow;

   if ( !curOverflow || curOverflow === "visible" )
      el.style.overflow = "hidden";

   var isOverflowing = el.clientWidth < el.scrollWidth 
      || el.clientHeight < el.scrollHeight;

   el.style.overflow = curOverflow;

   return isOverflowing;
}

Проверено в FF3, FF40.0.2, IE6, Chrome 0.2.149.30.

25
задан Parand 24 October 2008 в 13:17
поделиться

8 ответов

Это - более простая версия Вашего класса DictObj:

class DictObj(object):
    def __getattr__(self, attr):
        return self.__dict__.get(attr)

>>> d = DictObj()
>>> d.something = 'one'
>>> print d.something
one
>>> print d.somethingelse
None
>>> 
8
ответ дан mhawke 15 October 2019 в 15:47
поделиться

Ваш пример DictObj на самом деле довольно распространен. Доступ записи через точку стиля объекта может быть победой, если Вы имеете дело с ‘things, которые напоминают objects’, т.е. они зафиксировали имена свойства, содержащие только символы, допустимые в идентификаторах Python. Материал как строки базы данных или представления формы может быть полезно сохранен в этом виде объекта, делая код немного более читаемым без избытка ['доступ объекта'].

реализация немного ограничена - Вы не получаете хороший синтаксис конструктора dict, len (), сравнения, 'в', повторение или хороший reprs. Можно, конечно, реализовать те вещи сами, но в мире модернизированных классов можно получить их бесплатно путем простого разделения на подклассы dict:

class AttrDict(dict):
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

Для получения поведения значения по умолчанию ни одного просто разделите Python 2.5's на подклассы collections.defaultdict класс вместо dict.

22
ответ дан eatonphil 15 October 2019 в 15:47
поделиться

Относительно эти DictObj, следующее работало бы на Вас? Пустой класс позволит Вам произвольно добавлять к или материал замены в контейнерном объекте.

class Container(object):
    pass

>>> myContainer = Container()
>>> myContainer.spam = "in a can"
>>> myContainer.eggs = "in a shell"

, Если Вы хотите не бросить AttributeError, когда нет никакого атрибута, что Вы думаете о следующем? Лично, я предпочел бы использовать dict для ясности или использовать пункт попытки/кроме.

class QuietContainer(object):
    def __getattr__(self, attribute):
        try:
            return object.__getattr__(self,attribute)
        except AttributeError:
            return None

>>> cont = QuietContainer()
>>> print cont.me
None

Право?

12
ответ дан hlzr 15 October 2019 в 15:47
поделиться

Насколько я знаю, классы Python используют словари для хранения их атрибутов так или иначе (это скрыто от программиста), таким образом, это смотрит на меня, что, что Вы сделали, существует, эффективно эмулируют класс Python... с помощью класса Python.

3
ответ дан Smashery 15 October 2019 в 15:47
поделиться

Не "неправильно" сделать это, и может быть более хорошо, если Ваши словари имеют большую вероятность того, чтобы превращаться в объекты в какой-то момент, но опасаться причин того, чтобы иметь доступ скобки во-первых:

  1. доступ Dot не может использовать ключевые слова в качестве ключей.
  2. доступ Dot должен использовать Допустимые символы идентификатора Python в ключах.
  3. Словари могут содержать любой hashable элемент - не, просто представляет в виде строки.

Также имеют в виду, что можно всегда делать доступ объектов как словари, если Вы решаете переключиться на объекты позже.

Для случая как это я принял бы значение по умолчанию к "молитве" количеств удобочитаемости: по-видимому, другие Python программисты будут читать Ваш код, и они, вероятно, не будут ожидать гибриды словаря/объекта везде. Если бы это - хорошее проектное решение для конкретной ситуации, используйте его, но я не использовал бы его без необходимости сделать так.

3
ответ дан cdleary 15 October 2019 в 15:47
поделиться

Один главный недостаток использования чего-то как Ваш DictObj является Вами или должен ограничить допустимые ключи, или у Вас не может быть методов на Вашем DictObj такой как .keys(), .values(), .items(), и т.д.

2
ответ дан Ryan 15 October 2019 в 15:47
поделиться

Мне нравится запись через точку намного лучше, чем поля словаря лично. Причина, являющаяся этим, это заставляет автозавершение работать намного лучше.

1
ответ дан Jason Baker 15 October 2019 в 15:47
поделиться

Это не плохо, если это служит Вашей цели. "Практичность бьет чистоту".

я видел такой подход elserwhere (например, в Дорожный бетоноукладчик ), таким образом, это можно рассмотреть общая потребность (или требование).

1
ответ дан zgoda 15 October 2019 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: