所以我有这个密码:
# The Headers class is like a dictionary but is able to store multiple name-value pairs with the same name
class Headers:
def __init__( self, index = [] ):
self.index = index
def __contains__( self, name ):
for own_name, value in self.index:
if name.lower() == own_name.lower():
return True
return False
def __getitem__( self, name ):
for i in range( len( self.index ) ):
if name.lower() == self.index[i][0].lower():
return self.index[i][1]
def __iter__( self ):
return HeadersIterator( self )
def __setitem__( self, name, value ):
for i in range( len( self.index ) ):
if name.lower() == self.index[i][0].lower():
self.index[i][1] = value
def add( self, name, value ):
self.index.append( (name, value) )
class HeadersIterator:
def __init__( self, headers, index = 0 ):
self.headers = headers
self.index = index
def __next__( self ):
if self.index >= len( self.headers.index ):
raise StopIteration()
result = self.headers.index[ self.index ]
self.index += 1
return result
我只是有一个问题,当我试图使用它时,它似乎表现得好像是一个单身汉。下面是我使用它的一些其他代码:
def headers( self ):
hs = Headers()
print("huh?", Headers, hs.index, )
# Most headers start with HTTP_
for name, value in self.environ.items():
if name.startswith( 'HTTP_' ):
parts = [ (x[0].upper() + x[1:].lower()) for x in name[ len('HTTP_') : ].split( '_' ) ]
hs.add( '-'.join( parts ), value )
# Some don't
if 'CONTENT_LENGTH' in self.environ:
hs.add('Content-Length', str(self.environ['CONTENT_LENGTH']) )
return hs
现在看来,第二次打印“huh?”行时,hs变量似乎指向同一个Headers对象,这意味着它只会继续添加到同一个Headers变量中,而下一次返回的Headers变量中有更多的条目。 非常感谢您的帮助
Header
本身不是一个单子,但它们都是指相同的index
。这是由于建造商:这意味着Python构造一个列表,对于没有给定
index
的每个构造函数调用,都给出了对同一列表的引用您可以通过传递一个不可变的(例如
None
),然后使用if
语句并构造一个新列表来解决它,如下所示:尽管在某些情况下,将全局引用传递给构造函数是非常有用的(就像您在这里所做的那样),但还是建议谨慎地使用可变对象作为默认值:始终考虑传递不可变的(如
42
、None
、'foobar'
、True
、()
、…)相关问题 更多 >
编程相关推荐