Python: Атрибут списка вызовов из списка определенных атрибутов - PullRequest
0 голосов
/ 29 мая 2020

У меня есть список со списком операций, например ["insert", "append"]. Сейчас я делаю так, как если бы в списке написано «вставить», тогда я звоню .insert.

Проверьте код ниже

In [31]: list_ops = [ "insert" , "append" ]

In [32]: list1 = [ 1 , 3 , 5 ]

In [33]: if list_ops[0] == "insert" :
    ...:     list1.insert(3, 7)
    ...:

In [34]: list1
Out[34]: [1, 3, 5, 7]

In [35]: list1.list_ops[0](4, 9 )
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-35-5db0dcceeac1> in <module>
----> 1 list1.list_ops[0](4, 9 )

AttributeError: 'list' object has no attribute 'list_ops'

In [36]:

Как я могу выбрать операцию из самого list_ops вместо выполнения сопоставления if-else.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Вы не можете выбрать операцию из list_ops, потому что это список строк, а не операций. Вам нужно выбрать операцию на основе строки. Например:

list_ops = {
    "insert": list.insert,
    "append": list.append
}

Теперь вы можете выбрать операцию на основе входной строки. Можешь взять отсюда?

0 голосов
/ 29 мая 2020

Вы можете использовать exec и f-Strings, если действительно этого хотите:

operation = "append"
list1 = [1, 2, 3]

exec(f"list1.{operation}(4)")
print(list1) # [1, 2, 3, 4]

Но, честно говоря, я думаю, что лучше создать словарь операций, например предложенный Prune.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...