Python, __ слоты __, и “атрибут только для чтения”

это называется «побочные эффекты несовместимой файловой системы с коммиттером задания, который зависит от согласованных списков каталогов для переименования работы в место»

Исправления

  • Использование слоя согласованности; для S3A это S3Guard
  • Используйте альтернативный коммиттер: для ASF Spark и Hadoop 3.1 это «коммиттер с нулевым переименованием»
  • Радикально, но лучше в долгосрочной перспективе: используйте другой макет для данных, с Я имею в виду Apache Iceberg

Обновление: в данном конкретном случае это не так, поскольку Ceph - это FS, и он непротиворечив.

19
задан Augusta 18 September 2016 в 18:21
поделиться

4 ответа

Когда вы объявляете переменные экземпляра, используя __ slots __ , Python создает объект дескриптора как переменную класса с тем же именем. В вашем случае этот дескриптор перезаписывается переменной класса m , которую вы определяете в следующей строке:

  m = None # my attribute

Вот что вам нужно сделать: Не определяйте переменную класса с именем m и инициализировать переменную экземпляра m в методе __ init __ .

class MyClass(object):
  __slots__ = ("m",)
  def __init__(self):
    self.m = None

a = MyClass()
a.m = "?"

В качестве примечания, кортежам с отдельными элементами нужна запятая после элемента. Оба работают в вашем коде, потому что __ slots __ принимает одну строку или итерируемую / последовательность строк. В общем, для определения кортежа, содержащего элемент 1 , используйте (1,) или 1,

43
ответ дан 30 November 2019 в 02:02
поделиться

Вы неправильно используете ___ слотов __ . Он предотвращает создание __ dict __ для экземпляров. Это имеет смысл только в том случае, если вы столкнетесь с проблемами памяти со многими небольшими объектами, потому что избавление от __ dict __ может уменьшить занимаемую площадь. Это жесткая оптимизация, которая не требуется в 99,9% всех случаев.

Если вам нужна описанная вами безопасность, то Python действительно не тот язык. Лучше использовать что-то строгое, например, Java (вместо того, чтобы пытаться писать Java на Python).

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

Просто для полноты,

14
ответ дан 30 November 2019 в 02:02
поделиться

__ slots __ работает с переменными экземпляра, тогда как у вас есть переменная класса. Вот как вы должны это делать:

class MyClass( object ) :
  __slots__ = ( "m", )
  def __init__(self):
    self.m = None

a = MyClass()
a.m = "?"       # No error
7
ответ дан 30 November 2019 в 02:02
поделиться

Подумайте об этом.

class SuperSafe( object ):
    allowed= ( "this", "that" )
    def __init__( self ):
        self.this= None
        self.that= None
    def __setattr__( self, attr, value ):
        if attr not in self.allowed:
            raise Exception( "No such attribute: %s" % (attr,) )
        super( SuperSafe, self ).__setattr__( attr, value )

Лучше использовать модульные тесты для такого рода проверки. Это изрядные накладные расходы времени выполнения.

6
ответ дан 30 November 2019 в 02:02
поделиться
Другие вопросы по тегам:

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