точечная нотация в Python с использованием object

#python-3.x

#python-3.x

Вопрос:

Как легко выполнить точечную нотацию? Например, при издевательстве над результатами ArgumentParser . Я начал делать следующее:

 class ArbitraryObject:
    pass

foo = ArbitraryObject()
foo.dot = "dot notation works!"
foo.w00t = '!'
  

но я бы предпочел не создавать пользовательский класс для этого, поскольку они в конечном итоге засоряют мой код повсюду. Я бы предпочел использовать object напрямую, но это приводит к этой ошибке:

 >>> example_for_so = object()
>>> example_for_so.fail = "this should work, right?"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'fail'
>>> 
  

Итак, вопросы:

  • Есть ли более простой способ сделать это?
  • Такое использование точечной нотации обычно не одобряется?

Отредактируйте для уточнения:

Допустим, номинальный код выглядит следующим образом:

 if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Example for S/O")
    parser.add_argument("filename", type=str, help="Output file")
    args = parser.parse_args()

    complicated_object = ComplicatedClass(args)
    complicated_object.calculate()
  

тогда я хочу тест, который проверяет ComplicatedClass :

 def test_using_attrdict():
    # Arrange
    input = attrdict.AttrDict({"filename": "sample_file.yml"})

    # Act
    complicated_object = ComplicatedClass(input)
    complicated_object.calculate()
  

или

 def test_using_dot_notation():
    # Arrange
    input = ArbitraryObject()
    input.filename = "sample_file.yml"

    # Act
    complicated_object = ComplicatedClass(input)
    complicated_object.calculate()
  

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

1. Почему бы не использовать словарь? Похоже, что это именно то, для чего предназначены словари. a_dict["fail"] = "Some text"

2. Это не работает при использовании, object потому что object у экземпляров нет __dict__ атрибута для хранения этих атрибутов. У новых классов действительно есть __dict__ s, если вы явно не создаете их с помощью __slots__ вместо этого. В ваших вопросах задается вопрос «Не одобряется ли подобное использование точечной нотации?», Но неясно, что вы на самом деле делаете с этим.

3. Спасибо. Я понимаю, почему это не работает при использовании object() , но скорее я ищу более простой способ сделать это. Я пробовал использовать namedtuple s, но им трудно быть неизменяемыми