mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	 cc2b016125
			
		
	
	
		cc2b016125
		
	
	
	
	
		
			
			and .keys(), .items(), .values() return dict views. The dict views aren't fully functional yet; in particular, they can't be compared to sets yet. but they are useful as "iterator wells". There are still 27 failing unit tests; I expect that many of these have fairly trivial fixes, but there are so many, I could use help.
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| def flatten(tup):
 | |
|     elts = []
 | |
|     for elt in tup:
 | |
|         if isinstance(elt, tuple):
 | |
|             elts = elts + flatten(elt)
 | |
|         else:
 | |
|             elts.append(elt)
 | |
|     return elts
 | |
| 
 | |
| class Set:
 | |
|     def __init__(self):
 | |
|         self.elts = {}
 | |
|     def __len__(self):
 | |
|         return len(self.elts)
 | |
|     def __contains__(self, elt):
 | |
|         return elt in self.elts
 | |
|     def add(self, elt):
 | |
|         self.elts[elt] = elt
 | |
|     def elements(self):
 | |
|         return list(self.elts.keys())
 | |
|     def has_elt(self, elt):
 | |
|         return elt in self.elts
 | |
|     def remove(self, elt):
 | |
|         del self.elts[elt]
 | |
|     def copy(self):
 | |
|         c = Set()
 | |
|         c.elts.update(self.elts)
 | |
|         return c
 | |
| 
 | |
| class Stack:
 | |
|     def __init__(self):
 | |
|         self.stack = []
 | |
|         self.pop = self.stack.pop
 | |
|     def __len__(self):
 | |
|         return len(self.stack)
 | |
|     def push(self, elt):
 | |
|         self.stack.append(elt)
 | |
|     def top(self):
 | |
|         return self.stack[-1]
 | |
|     def __getitem__(self, index): # needed by visitContinue()
 | |
|         return self.stack[index]
 | |
| 
 | |
| MANGLE_LEN = 256 # magic constant from compile.c
 | |
| 
 | |
| def mangle(name, klass):
 | |
|     if not name.startswith('__'):
 | |
|         return name
 | |
|     if len(name) + 2 >= MANGLE_LEN:
 | |
|         return name
 | |
|     if name.endswith('__'):
 | |
|         return name
 | |
|     try:
 | |
|         i = 0
 | |
|         while klass[i] == '_':
 | |
|             i = i + 1
 | |
|     except IndexError:
 | |
|         return name
 | |
|     klass = klass[i:]
 | |
| 
 | |
|     tlen = len(klass) + len(name)
 | |
|     if tlen > MANGLE_LEN:
 | |
|         klass = klass[:MANGLE_LEN-tlen]
 | |
| 
 | |
|     return "_%s%s" % (klass, name)
 | |
| 
 | |
| def set_filename(filename, tree):
 | |
|     """Set the filename attribute to filename on every node in tree"""
 | |
|     worklist = [tree]
 | |
|     while worklist:
 | |
|         node = worklist.pop(0)
 | |
|         node.filename = filename
 | |
|         worklist.extend(node.getChildNodes())
 |