#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, но им трудно быть неизменяемыми