итерация по неинтерполированному массиву символов эквивалента python

#python #ruby

#python #ruby

Вопрос:

В настоящее время я пишу скрипт на python из модуля ruby. У меня возникли проблемы с этим аспектом перевода ruby на python.

Ruby:

 plan_metrics[test_name]={ passed_count: 0, blocked_count: 0, untested_count: 0, failed_count: 0, reviewed_count: 0, test_harness_issue_count: 0, bug_failure_count: 0, defect_list: [] }
entry['runs'].each do |run|
      metric_hash = plan_metrics[test_name]
      %i[passed_count blocked_count untested_count failed_count].each do |key|
        metric_hash[key] = metric_hash[key]   run[key.to_s]
      end
  

В этом коде entry['runs'] хранятся фактические значения passed_count , blocked_count , untested_count , и failed_count , но в нескольких словарях. Предполагается, что это перебирает их, суммирует все значения и помещает их в ОДИН символ (т.е. passed_count ), который хранится в metric_hash

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

Мой перевод на Python:

 plan_metrics[test_name]={ "passed_count": 0, "blocked_count": 0, "untested_count": 0, "failed_count": 0, "reviewed_count": 0, "test_harness_issue_count": 0, "bug_failure_count": 0, "defect_list": [] }
for run in entry["runs"]:
       metric_hash = plan_metrics[test_name]
       for key in [metric_hash["passed_count"], metric_hash["blocked_count"], metric_hash["untested_count"], metric_hash["failed_count"]:
             metric_hash[key] = metric_hash[key]   run[str(key)]
  

Но для этого я KeyError: 0 подключаюсь metric_hash[key] = metric_hash[key] run[str(key)]

было бы

for key in [metric_hash["passed_count"], metric_hash["blocked_count"], metric_hash["untested_count"], metric_hash["failed_count"]:

быть надлежащим эквивалентом

%i[passed_count blocked_count untested_count failed_count].each do |key|

и если да, то что вызывает KeyError: 0?

если нет, то как я могу выполнить то, что сделал пример ruby, с взаимодействием по массиву символов в python

Если вам нужна дополнительная информация о данных, дайте мне знать, за что print() благодарить

Ответ №1:

В python вы делаете

    for key in [metric_hash["passed_count"], metric_hash["blocked_count"], metric_hash["untested_count"], metric_hash["failed_count"]:
  

Это означает, что key принимает значения из списка [0, 0, 0, 0] . Вы понимаете, почему?

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

1. Да, это то, что у меня есть выше, вы спрашиваете, чтобы я понял, почему существует keyerror: 0 ?

2. @Mfreeman: Я спрашиваю, вы понимаете, почему эта строка эквивалентна for key in [0, 0, 0, 0] ?

3. Да, я это вижу, но я не вижу вашей точки зрения, кроме того, что они равны. Означает ли это, что это не будет правильным переводом, поскольку в примере ruby используются символы?

4. В примере ruby это изменение значения символов (т.е. passed_count ), Но в примере python я просто меняю список чисел, ни к чему не привязанных. Мой вопрос в том, как я мог бы выполнить это на python

5. @Mfreeman: да, точно, это неправильный перевод. Вы не передаете ключи (как в ruby), вы передаете значения этих ключей. Вы можете исправить свой код на python, передав ключи, такие же, как у ruby. Вы знаете, что %i[passed_count blocked_count] или %w[passed_count blocked_count] делать в ruby, да?