Во-первых, в программу должен быть включен модуль re
.
Во-вторых, у вас есть опечатка в строке 4:
for atom in re.finditer( "([A-Z][a-z]{0,2})(\d*)", SummaryFormula):
должно читаться
for atom in re.finditer( "([A-Z][a-z]{0,2})(\d*)", summaryFormula):
то есть строчные буквы s
в summaryFormula
.
SummaryFormula
относится к названию класса, а summaryFormula
относится ко второму параметру (после self
) __init__
method.
В-третьих, строка addAtoms = SummaryFormula(b)
передает экземпляр SummaryFormula
в качестве аргумента b
(назначается в части верхнего уровня скрипта test.extend(toExtend)
.
Фиксированная программадолжен выглядеть так:
import re
class SummaryFormula:
def __init__(self, summaryFormula):
self.atoms = {}
for atom in re.finditer("([A-Z][a-z]{0,2})(\d*)", summaryFormula):
symbol = atom.group(1)
count = atom.group(2)
def extend( self, b):
# these are the two dictionaries of both molecules
originalFormula = self.atoms.copy()
self.atoms.clear()
# PASS AN APPROPRIATE VALUE HERE!
addAtoms = SummaryFormula("SOME STRING")
# and here both dictionaries are merged
for atom in addAtoms.atoms.keys():
if atom in originalFormula.keys():
self.atoms[ atom] = originalFormula[ atom]
self.atoms[ atom] += addAtoms.atoms[ atom]
else:
pass
for atom in originalFormula.keys():
if atom not in self.atoms.keys():
self.atoms[ atom] = originalFormula[ atom]
#this is what works now
test = SummaryFormula("H2CFe2")
test.extend("H5C5") #result is a molecule H7C6Fe2
#this is what I want instead
test = SummaryFormula("H2CFe2")
toExtend = SummaryFormula("H5C5")
test.extend(toExtend)
с заменой "SOME STRING"
на предполагаемый строковый литерал или ссылку на строковую переменную. Я не знаю точное намерение программы, поэтому оставлю это кому-то другомуопределите, что эта программа должна передать конструктору SummaryFormula
на данный момент.
Надеюсь, это поможет!