blob: de2951844aef2b5831558c41d5c643cf5456b3cf [file] [log] [blame]
Guido van Rossum7d5b99d1997-11-21 17:12:59 +00001"""Helper class to quickly write a loop over all standard input files.
2
3Typical use is:
4
5 import fileinput
6 for line in fileinput.input():
7 process(line)
8
9This iterates over the lines of all files listed in sys.argv[1:],
10defaulting to sys.stdin if the list is empty. If a filename is '-' it
11is also replaced by sys.stdin. To specify an alternative list of
12filenames, pass it as the argument to input(). A single file name is
13also allowed.
14
15Functions filename(), lineno() return the filename and cumulative line
16number of the line that has just been read; filelineno() returns its
17line number in the current file; isfirstline() returns true iff the
18line just read is the first line of its file; isstdin() returns true
19iff the line was read from sys.stdin. Function nextfile() closes the
20current file so that the next iteration will read the first line from
21the next file (if any); lines not read from the file will not count
22towards the cumulative line count; the filename is not changed until
23after the first line of the next file has been read. Function close()
24closes the sequence.
25
26Before any lines have been read, filename() returns None and both line
27numbers are zero; nextfile() has no effect. After all lines have been
28read, filename() and the line number functions return the values
29pertaining to the last line read; nextfile() has no effect.
30
Georg Brandlc029f872006-02-19 14:12:34 +000031All files are opened in text mode by default, you can override this by
32setting the mode parameter to input() or FileInput.__init__().
Andrew Svetlovf7a17b42012-12-25 16:47:37 +020033If an I/O error occurs during opening or reading a file, the OSError
Georg Brandlc029f872006-02-19 14:12:34 +000034exception is raised.
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000035
36If sys.stdin is used more than once, the second and further use will
37return no lines, except perhaps for interactive use, or if it has been
38explicitly reset (e.g. using sys.stdin.seek(0)).
39
40Empty files are opened and immediately closed; the only time their
41presence in the list of filenames is noticeable at all is when the
42last file opened is empty.
43
44It is possible that the last line of a file doesn't end in a newline
45character; otherwise lines are returned including the trailing
46newline.
47
48Class FileInput is the implementation; its methods filename(),
49lineno(), fileline(), isfirstline(), isstdin(), nextfile() and close()
50correspond to the functions in the module. In addition it has a
51readline() method which returns the next input line, and a
52__getitem__() method which implements the sequence behavior. The
53sequence must be accessed in strictly sequential order; sequence
54access and readline() cannot be mixed.
55
56Optional in-place filtering: if the keyword argument inplace=1 is
57passed to input() or to the FileInput constructor, the file is moved
58to a backup file and standard output is directed to the input file.
59This makes it possible to write a filter that rewrites its input file
60in place. If the keyword argument backup=".<some extension>" is also
61given, it specifies the extension for the backup file, and the backup
62file remains around; by default, the extension is ".bak" and it is
63deleted when the output file is closed. In-place filtering is
64disabled when standard input is read. XXX The current implementation
65does not work for MS-DOS 8+3 filesystems.
66
Guido van Rossum47955242001-01-05 14:44:39 +000067Performance: this module is unfortunately one of the slower ways of
68processing large numbers of input lines. Nevertheless, a significant
69speed-up has been obtained by using readlines(bufsize) instead of
70readline(). A new keyword argument, bufsize=N, is present on the
71input() function and the FileInput() class to override the default
72buffer size.
73
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000074XXX Possible additions:
75
76- optional getopt argument processing
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000077- isatty()
78- read(), read(size), even readlines()
79
80"""
81
Walter Dörwald294bbf32002-06-06 09:48:13 +000082import sys, os
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000083
Georg Brandlef0a8652009-05-17 12:22:57 +000084__all__ = ["input", "close", "nextfile", "filename", "lineno", "filelineno",
85 "isfirstline", "isstdin", "FileInput"]
Skip Montanaroeccd02a2001-01-20 23:34:12 +000086
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000087_state = None
88
Guido van Rossum47955242001-01-05 14:44:39 +000089DEFAULT_BUFSIZE = 8*1024
90
Georg Brandlef0a8652009-05-17 12:22:57 +000091def input(files=None, inplace=False, backup="", bufsize=0,
Georg Brandlc98eeed2006-02-19 14:57:47 +000092 mode="r", openhook=None):
Terry Jan Reedy70d2c712013-06-28 18:59:28 -040093 """Return an instance of the FileInput class, which can be iterated.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +000094
Terry Jan Reedy70d2c712013-06-28 18:59:28 -040095 The parameters are passed to the constructor of the FileInput class.
96 The returned instance, in addition to being an iterator,
97 keeps global state for the functions of this module,.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +000098 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000099 global _state
100 if _state and _state._file:
Collin Winterce36ad82007-08-30 01:19:48 +0000101 raise RuntimeError("input() already active")
Georg Brandlc98eeed2006-02-19 14:57:47 +0000102 _state = FileInput(files, inplace, backup, bufsize, mode, openhook)
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000103 return _state
104
105def close():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000106 """Close the sequence."""
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000107 global _state
108 state = _state
109 _state = None
110 if state:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000111 state.close()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000112
113def nextfile():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000114 """
115 Close the current file so that the next iteration will read the first
116 line from the next file (if any); lines not read from the file will
117 not count towards the cumulative line count. The filename is not
118 changed until after the first line of the next file has been read.
119 Before the first line has been read, this function has no effect;
120 it cannot be used to skip the first file. After the last line of the
Tim Peters8ac14952002-05-23 15:15:30 +0000121 last file has been read, this function has no effect.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000122 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000123 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000124 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000125 return _state.nextfile()
126
127def filename():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000128 """
129 Return the name of the file currently being read.
Tim Peters8ac14952002-05-23 15:15:30 +0000130 Before the first line has been read, returns None.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000131 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000132 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000133 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000134 return _state.filename()
135
136def lineno():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000137 """
138 Return the cumulative line number of the line that has just been read.
139 Before the first line has been read, returns 0. After the last line
Tim Peters8ac14952002-05-23 15:15:30 +0000140 of the last file has been read, returns the line number of that line.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000141 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000142 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000143 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000144 return _state.lineno()
145
146def filelineno():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000147 """
148 Return the line number in the current file. Before the first line
149 has been read, returns 0. After the last line of the last file has
Tim Peters8ac14952002-05-23 15:15:30 +0000150 been read, returns the line number of that line within the file.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000151 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000152 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000153 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000154 return _state.filelineno()
155
Georg Brandl67e9fb92006-02-19 13:56:17 +0000156def fileno():
157 """
158 Return the file number of the current file. When no file is currently
159 opened, returns -1.
160 """
161 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000162 raise RuntimeError("no active input()")
Georg Brandl67e9fb92006-02-19 13:56:17 +0000163 return _state.fileno()
164
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000165def isfirstline():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000166 """
167 Returns true the line just read is the first line of its file,
Tim Peters8ac14952002-05-23 15:15:30 +0000168 otherwise returns false.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000169 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000170 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000171 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000172 return _state.isfirstline()
173
174def isstdin():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000175 """
176 Returns true if the last line was read from sys.stdin,
Tim Peters8ac14952002-05-23 15:15:30 +0000177 otherwise returns false.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000178 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000179 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000180 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000181 return _state.isstdin()
182
183class FileInput:
Terry Jan Reedy70d2c712013-06-28 18:59:28 -0400184 """FileInput([files[, inplace[, backup[, bufsize, [, mode[, openhook]]]]]])
Tim Peters8ac14952002-05-23 15:15:30 +0000185
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000186 Class FileInput is the implementation of the module; its methods
Georg Brandl67e9fb92006-02-19 13:56:17 +0000187 filename(), lineno(), fileline(), isfirstline(), isstdin(), fileno(),
188 nextfile() and close() correspond to the functions of the same name
189 in the module.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000190 In addition it has a readline() method which returns the next
191 input line, and a __getitem__() method which implements the
192 sequence behavior. The sequence must be accessed in strictly
Tim Peters8ac14952002-05-23 15:15:30 +0000193 sequential order; random access and readline() cannot be mixed.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000194 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000195
Georg Brandlef0a8652009-05-17 12:22:57 +0000196 def __init__(self, files=None, inplace=False, backup="", bufsize=0,
Georg Brandlc98eeed2006-02-19 14:57:47 +0000197 mode="r", openhook=None):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000198 if isinstance(files, str):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000199 files = (files,)
200 else:
Guido van Rossum2516b392000-04-10 17:16:12 +0000201 if files is None:
202 files = sys.argv[1:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000203 if not files:
Guido van Rossum2516b392000-04-10 17:16:12 +0000204 files = ('-',)
205 else:
206 files = tuple(files)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000207 self._files = files
208 self._inplace = inplace
209 self._backup = backup
Guido van Rossum47955242001-01-05 14:44:39 +0000210 self._bufsize = bufsize or DEFAULT_BUFSIZE
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000211 self._savestdout = None
212 self._output = None
213 self._filename = None
214 self._lineno = 0
215 self._filelineno = 0
216 self._file = None
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000217 self._isstdin = False
Guido van Rossum0aec9fb1998-07-20 15:49:28 +0000218 self._backupfilename = None
Guido van Rossum47955242001-01-05 14:44:39 +0000219 self._buffer = []
220 self._bufindex = 0
Georg Brandlc029f872006-02-19 14:12:34 +0000221 # restrict mode argument to reading modes
222 if mode not in ('r', 'rU', 'U', 'rb'):
223 raise ValueError("FileInput opening mode must be one of "
224 "'r', 'rU', 'U' and 'rb'")
Serhiy Storchaka6787a382013-11-23 22:12:06 +0200225 if 'U' in mode:
226 import warnings
Serhiy Storchaka2480c2e2013-11-24 23:13:26 +0200227 warnings.warn("'U' mode is deprecated",
Serhiy Storchaka6787a382013-11-23 22:12:06 +0200228 DeprecationWarning, 2)
Georg Brandlc029f872006-02-19 14:12:34 +0000229 self._mode = mode
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200230 if openhook:
231 if inplace:
232 raise ValueError("FileInput cannot use an opening hook in inplace mode")
233 if not callable(openhook):
234 raise ValueError("FileInput openhook must be callable")
Georg Brandlc98eeed2006-02-19 14:57:47 +0000235 self._openhook = openhook
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000236
237 def __del__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000238 self.close()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000239
240 def close(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000241 self.nextfile()
242 self._files = ()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000243
Georg Brandl6cb7b652010-07-31 20:08:15 +0000244 def __enter__(self):
245 return self
246
247 def __exit__(self, type, value, traceback):
248 self.close()
249
Neil Schemenauer908632a2002-03-26 20:28:40 +0000250 def __iter__(self):
251 return self
252
Georg Brandla18af4e2007-04-21 15:47:16 +0000253 def __next__(self):
Guido van Rossum47955242001-01-05 14:44:39 +0000254 try:
255 line = self._buffer[self._bufindex]
256 except IndexError:
257 pass
258 else:
259 self._bufindex += 1
260 self._lineno += 1
261 self._filelineno += 1
262 return line
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000263 line = self.readline()
264 if not line:
Neil Schemenauer908632a2002-03-26 20:28:40 +0000265 raise StopIteration
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000266 return line
Tim Peters863ac442002-04-16 01:38:40 +0000267
Neil Schemenauer908632a2002-03-26 20:28:40 +0000268 def __getitem__(self, i):
269 if i != self._lineno:
Collin Winterce36ad82007-08-30 01:19:48 +0000270 raise RuntimeError("accessing lines out of order")
Neil Schemenauer908632a2002-03-26 20:28:40 +0000271 try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000272 return self.__next__()
Neil Schemenauer908632a2002-03-26 20:28:40 +0000273 except StopIteration:
Collin Winterce36ad82007-08-30 01:19:48 +0000274 raise IndexError("end of input reached")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000275
276 def nextfile(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000277 savestdout = self._savestdout
278 self._savestdout = 0
279 if savestdout:
280 sys.stdout = savestdout
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000281
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000282 output = self._output
283 self._output = 0
284 if output:
285 output.close()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000286
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000287 file = self._file
288 self._file = 0
289 if file and not self._isstdin:
290 file.close()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000291
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000292 backupfilename = self._backupfilename
293 self._backupfilename = 0
294 if backupfilename and not self._backup:
295 try: os.unlink(backupfilename)
Skip Montanarocffac662002-08-14 02:58:16 +0000296 except OSError: pass
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000297
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000298 self._isstdin = False
Guido van Rossum47955242001-01-05 14:44:39 +0000299 self._buffer = []
300 self._bufindex = 0
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000301
302 def readline(self):
Guido van Rossum47955242001-01-05 14:44:39 +0000303 try:
304 line = self._buffer[self._bufindex]
305 except IndexError:
306 pass
307 else:
308 self._bufindex += 1
309 self._lineno += 1
310 self._filelineno += 1
311 return line
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000312 if not self._file:
313 if not self._files:
314 return ""
315 self._filename = self._files[0]
316 self._files = self._files[1:]
317 self._filelineno = 0
318 self._file = None
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000319 self._isstdin = False
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000320 self._backupfilename = 0
321 if self._filename == '-':
322 self._filename = '<stdin>'
323 self._file = sys.stdin
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000324 self._isstdin = True
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000325 else:
326 if self._inplace:
327 self._backupfilename = (
Skip Montanaro7a98be22007-08-16 14:35:24 +0000328 self._filename + (self._backup or ".bak"))
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200329 try:
330 os.unlink(self._backupfilename)
331 except OSError:
332 pass
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200333 # The next few lines may raise OSError
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000334 os.rename(self._filename, self._backupfilename)
Georg Brandlc029f872006-02-19 14:12:34 +0000335 self._file = open(self._backupfilename, self._mode)
Guido van Rossumdcb85831999-10-18 21:41:43 +0000336 try:
Walter Dörwald294bbf32002-06-06 09:48:13 +0000337 perm = os.fstat(self._file.fileno()).st_mode
Skip Montanarocffac662002-08-14 02:58:16 +0000338 except OSError:
Guido van Rossumdcb85831999-10-18 21:41:43 +0000339 self._output = open(self._filename, "w")
340 else:
Guido van Rossum6203d8f2007-10-29 17:39:59 +0000341 mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC
342 if hasattr(os, 'O_BINARY'):
343 mode |= os.O_BINARY
344
345 fd = os.open(self._filename, mode, perm)
Guido van Rossumdcb85831999-10-18 21:41:43 +0000346 self._output = os.fdopen(fd, "w")
347 try:
Jack Jansen52941a82003-01-08 16:33:16 +0000348 if hasattr(os, 'chmod'):
349 os.chmod(self._filename, perm)
Skip Montanarocffac662002-08-14 02:58:16 +0000350 except OSError:
Guido van Rossumdcb85831999-10-18 21:41:43 +0000351 pass
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000352 self._savestdout = sys.stdout
353 sys.stdout = self._output
354 else:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200355 # This may raise OSError
Georg Brandlc98eeed2006-02-19 14:57:47 +0000356 if self._openhook:
357 self._file = self._openhook(self._filename, self._mode)
358 else:
359 self._file = open(self._filename, self._mode)
Guido van Rossum47955242001-01-05 14:44:39 +0000360 self._buffer = self._file.readlines(self._bufsize)
361 self._bufindex = 0
362 if not self._buffer:
363 self.nextfile()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000364 # Recursive call
365 return self.readline()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000366
367 def filename(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000368 return self._filename
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000369
370 def lineno(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000371 return self._lineno
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000372
373 def filelineno(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000374 return self._filelineno
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000375
Georg Brandl67e9fb92006-02-19 13:56:17 +0000376 def fileno(self):
377 if self._file:
378 try:
379 return self._file.fileno()
380 except ValueError:
381 return -1
382 else:
383 return -1
384
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000385 def isfirstline(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000386 return self._filelineno == 1
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000387
388 def isstdin(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000389 return self._isstdin
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000390
Georg Brandlc98eeed2006-02-19 14:57:47 +0000391
392def hook_compressed(filename, mode):
393 ext = os.path.splitext(filename)[1]
394 if ext == '.gz':
395 import gzip
396 return gzip.open(filename, mode)
397 elif ext == '.bz2':
398 import bz2
399 return bz2.BZ2File(filename, mode)
400 else:
401 return open(filename, mode)
402
403
404def hook_encoded(encoding):
Georg Brandlc98eeed2006-02-19 14:57:47 +0000405 def openhook(filename, mode):
Florent Xiclunaa011e2b2011-11-07 19:43:07 +0100406 return open(filename, mode, encoding=encoding)
Georg Brandlc98eeed2006-02-19 14:57:47 +0000407 return openhook
408
409
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000410def _test():
411 import getopt
Georg Brandlef0a8652009-05-17 12:22:57 +0000412 inplace = False
413 backup = False
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000414 opts, args = getopt.getopt(sys.argv[1:], "ib:")
415 for o, a in opts:
Georg Brandlef0a8652009-05-17 12:22:57 +0000416 if o == '-i': inplace = True
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000417 if o == '-b': backup = a
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000418 for line in input(args, inplace=inplace, backup=backup):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000419 if line[-1:] == '\n': line = line[:-1]
420 if line[-1:] == '\r': line = line[:-1]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000421 print("%d: %s[%d]%s %s" % (lineno(), filename(), filelineno(),
422 isfirstline() and "*" or "", line))
423 print("%d: %s[%d]" % (lineno(), filename(), filelineno()))
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000424
425if __name__ == '__main__':
426 _test()