我知道这可能是一个愚蠢的问题,但我是Python新手,如果我声明一个函数def myFunction( b)
并将一个对象的实例传递给它,我得到TypeError:期望的字符串或缓冲区。
更具体地说,我有一个以下代码,用于解析汇总分子公式并从中创建一个对象。
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()
addAtoms = SummaryFormula( b)
# 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)
谢谢Tomas
答案 0 :(得分:1)
首先,该程序需要包含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__
之后)。
第三,行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
的构造函数。
希望有所帮助!
答案 1 :(得分:1)
extend
中,您说:
addAtoms = SummaryFormula( b)
因此,将SummaryFormula实例传递给SummaryFormula的__init__
方法。这里(以前面提到的拼写为模),这个对象被赋予re.finditer
:
for atom in re.finditer( "([A-Z][a-z]{0,2})(\d*)", summaryFormula)
函数re.finditer
需要一个字符串;它不知道如何处理SummaryFormula
实例。
有几种方法可以解决这个问题。最简单的方法是在尝试创建之前检查是否已有SummaryFormula实例:
if isinstance(b, SummaryFormula):
addAtoms = b
else if isinstance(b, str):
addAtoms = SummaryFormula(b)
else:
raise TypeError("Expected a SummaryFormula or equivalent string.")
答案 2 :(得分:1)
简而言之,您可以将任何对象传递给函数,包括您创建的类的实例。
更一般地说,Python中的所有内容都是一个对象。这是Python中的键概念,所以如果你是这个语言的新手,可以花一些时间熟悉,因为它会帮助你编写更简洁和pythonic的代码。
你得到的错误不是来自传递一个类实例对象,而是在某个地方生成(看到其他答案,因为它们似乎在它上面),否则在你的代码中由另一个期望字符串的函数或操作生成,或者要操作的类似字符串的对象。例如,您可以通过执行以下操作生成类似的错误:
>>> a = 2
>>> open(a, 'r')
TypeError: coercing to Unicode: need string or buffer, int found
这里发生错误是因为文件打开函数open
期望字符串而不是整数。