@@ -18,7 +18,7 @@ def __init__(self, name, mismatch):
1818 self .mismatch = mismatch
1919
2020 def __str__ (self ):
21- return ' In program: \ ' {}\ ' . {}' .format (self .name ,self .mismatch )
21+ return " In program: '{}'. {}" .format (self .name , self .mismatch )
2222
2323
2424class Compare :
@@ -38,7 +38,7 @@ def __process_file(file):
3838 file .output_file .seek (0 )
3939 return file .output_filename , file .output_file .read ()
4040 else :
41- with open (file , "r" , newline = ' \n ' ) as f :
41+ with open (file , "r" , newline = " \n " ) as f :
4242 return file , f .read ()
4343
4444 @staticmethod
@@ -51,26 +51,43 @@ def __normal_max_workers(workers):
5151
5252 @classmethod
5353 def output (cls , * files , ** kwargs ):
54- kwargs = unpack_kwargs ('output' , kwargs , ('std' , ('grader' , DEFAULT_GRADER ), ('max_workers' , - 1 ),
55- ('job_pool' , None ), ('stop_on_incorrect' , None )))
56- std = kwargs ['std' ]
57- grader = kwargs ['grader' ]
58- max_workers = kwargs ['max_workers' ]
59- job_pool = kwargs ['job_pool' ]
60- if kwargs ['stop_on_incorrect' ] is not None :
54+ kwargs = unpack_kwargs (
55+ "output" ,
56+ kwargs ,
57+ (
58+ "std" ,
59+ ("grader" , DEFAULT_GRADER ),
60+ ("max_workers" , - 1 ),
61+ ("job_pool" , None ),
62+ ("stop_on_incorrect" , None ),
63+ ),
64+ )
65+ std = kwargs ["std" ]
66+ grader = kwargs ["grader" ]
67+ max_workers = kwargs ["max_workers" ]
68+ job_pool = kwargs ["job_pool" ]
69+ if kwargs ["stop_on_incorrect" ] is not None :
6170 log .warn ("parameter stop_on_incorrect is deprecated and has no effect." )
6271
6372 if (max_workers is None or max_workers >= 0 ) and job_pool is None :
6473 max_workers = cls .__normal_max_workers (max_workers )
6574 try :
6675 from concurrent .futures import ThreadPoolExecutor
76+
6777 with ThreadPoolExecutor (max_workers = max_workers ) as job_pool :
68- return cls .output (* files , std = std , grader = grader , max_workers = max_workers , job_pool = job_pool )
78+ return cls .output (
79+ * files ,
80+ std = std ,
81+ grader = grader ,
82+ max_workers = max_workers ,
83+ job_pool = job_pool
84+ )
6985 except ImportError :
7086 pass
7187
7288 def get_std ():
7389 return cls .__process_file (std )[1 ]
90+
7491 if job_pool is not None :
7592 std = job_pool .submit (get_std ).result ()
7693 else :
@@ -87,61 +104,118 @@ def do(file):
87104
88105 @classmethod
89106 def program (cls , * programs , ** kwargs ):
90- kwargs = unpack_kwargs ('program' , kwargs , ('input' , ('std' , None ), ('std_program' , None ),
91- ('grader' , DEFAULT_GRADER ), ('max_workers' , - 1 ),
92- ('job_pool' , None ), ('stop_on_incorrect' , None )))
93- input = kwargs ['input' ]
94- std = kwargs ['std' ]
95- std_program = kwargs ['std_program' ]
96- grader = kwargs ['grader' ]
97- max_workers = kwargs ['max_workers' ]
98- job_pool = kwargs ['job_pool' ]
99- if kwargs ['stop_on_incorrect' ] is not None :
107+ kwargs = unpack_kwargs (
108+ "program" ,
109+ kwargs ,
110+ (
111+ "input" ,
112+ ("std" , None ),
113+ ("std_program" , None ),
114+ ("grader" , DEFAULT_GRADER ),
115+ ("max_workers" , - 1 ),
116+ ("job_pool" , None ),
117+ ("stop_on_incorrect" , None ),
118+ ),
119+ )
120+ input = kwargs ["input" ]
121+ std = kwargs ["std" ]
122+ std_program = kwargs ["std_program" ]
123+ grader = kwargs ["grader" ]
124+ max_workers = kwargs ["max_workers" ]
125+ job_pool = kwargs ["job_pool" ]
126+ if kwargs ["stop_on_incorrect" ] is not None :
100127 log .warn ("parameter stop_on_incorrect is deprecated and has no effect." )
101128
102129 if (max_workers is None or max_workers >= 0 ) and job_pool is None :
103130 max_workers = cls .__normal_max_workers (max_workers )
104131 try :
105132 from concurrent .futures import ThreadPoolExecutor
133+
106134 with ThreadPoolExecutor (max_workers = max_workers ) as job_pool :
107- return cls .program (* programs , input = input , std = std , std_program = std_program , grader = grader , max_workers = max_workers , job_pool = job_pool )
135+ return cls .program (
136+ * programs ,
137+ input = input ,
138+ std = std ,
139+ std_program = std_program ,
140+ grader = grader ,
141+ max_workers = max_workers ,
142+ job_pool = job_pool
143+ )
108144 except ImportError :
109145 pass
110146
111147 if not isinstance (input , IO ):
112- raise TypeError ("expect {}, got {}" .format (type (IO ).__name__ , type (input ).__name__ ))
148+ raise TypeError (
149+ "expect {}, got {}" .format (type (IO ).__name__ , type (input ).__name__ )
150+ )
113151 input .flush_buffer ()
114152 input .input_file .seek (0 )
115153
116154 if std_program is not None :
155+
117156 def get_std ():
118- with open (os .dup (input .input_file .fileno ()), 'r' , newline = '\n ' ) as input_file :
119- content = make_unicode (subprocess .check_output (std_program , shell = (not list_like (std_program )), stdin = input .input_file , universal_newlines = True ))
157+ with open (
158+ os .dup (input .input_file .fileno ()), "r" , newline = "\n "
159+ ) as input_file :
160+ content = make_unicode (
161+ subprocess .check_output (
162+ std_program ,
163+ shell = (not list_like (std_program )),
164+ stdin = input .input_file ,
165+ universal_newlines = True ,
166+ )
167+ )
120168 input_file .seek (0 )
121169 return content
170+
122171 if job_pool is not None :
123172 std = job_pool .submit (get_std ).result ()
124173 else :
125174 std = get_std ()
126175 elif std is not None :
176+
127177 def get_std ():
128178 return cls .__process_file (std )[1 ]
179+
129180 if job_pool is not None :
130181 std = job_pool .submit (get_std ).result ()
131182 else :
132183 std = get_std ()
133184 else :
134- raise TypeError ('program() missing 1 required non-None keyword-only argument: \' std\' or \' std_program\' ' )
185+ raise TypeError (
186+ "program() missing 1 required non-None keyword-only argument: 'std' or 'std_program'"
187+ )
135188
136189 def do (program_name ):
137190 timeout = None
138- if list_like (program_name ) and len (program_name ) == 2 and int_like (program_name [- 1 ]):
191+ if (
192+ list_like (program_name )
193+ and len (program_name ) == 2
194+ and int_like (program_name [- 1 ])
195+ ):
139196 program_name , timeout = program_name
140- with open (os .dup (input .input_file .fileno ()), 'r' , newline = '\n ' ) as input_file :
197+ with open (
198+ os .dup (input .input_file .fileno ()), "r" , newline = "\n "
199+ ) as input_file :
141200 if timeout is None :
142- content = make_unicode (subprocess .check_output (program_name , shell = (not list_like (program_name )), stdin = input_file , universal_newlines = True ))
201+ content = make_unicode (
202+ subprocess .check_output (
203+ program_name ,
204+ shell = (not list_like (program_name )),
205+ stdin = input_file ,
206+ universal_newlines = True ,
207+ )
208+ )
143209 else :
144- content = make_unicode (subprocess .check_output (program_name , shell = (not list_like (program_name )), stdin = input_file , universal_newlines = True , timeout = timeout ))
210+ content = make_unicode (
211+ subprocess .check_output (
212+ program_name ,
213+ shell = (not list_like (program_name )),
214+ stdin = input_file ,
215+ universal_newlines = True ,
216+ timeout = timeout ,
217+ )
218+ )
145219 input_file .seek (0 )
146220 cls .__compare_two (program_name , content , std , grader )
147221
0 commit comments