|
25 | 25 | { |
26 | 26 | "cell_type": "code", |
27 | 27 | "execution_count": null, |
28 | | - "metadata": {}, |
| 28 | + "metadata": { |
| 29 | + "tags": [] |
| 30 | + }, |
29 | 31 | "outputs": [], |
30 | 32 | "source": [ |
31 | 33 | "from nbdev.showdoc import *\n", |
|
199 | 201 | "outputs": [], |
200 | 202 | "source": [ |
201 | 203 | "#export\n", |
202 | | - "cmp_instance = functools.cmp_to_key(lambda a,b: 0 if a==b else 1 if issubclass(a,b) else -1)" |
| 204 | + "def sorted_topologically(iterable, *, cmp=operator.lt, reverse=False):\n", |
| 205 | + " \"Return a new list containing all items from the iterable sorted topologically\"\n", |
| 206 | + " l,res = L(list(iterable)),[]\n", |
| 207 | + " for _ in range(len(l)):\n", |
| 208 | + " t = l.reduce(lambda x,y: y if cmp(x,y) else x)\n", |
| 209 | + " res.append(t), l.remove(t)\n", |
| 210 | + " return res[::-1] if reverse else res" |
203 | 211 | ] |
204 | 212 | }, |
205 | 213 | { |
|
209 | 217 | "outputs": [], |
210 | 218 | "source": [ |
211 | 219 | "td = {int:1, numbers.Number:2, numbers.Integral:3}\n", |
212 | | - "test_eq(sorted(td, key=cmp_instance), [numbers.Number, numbers.Integral, int])" |
| 220 | + "test_eq(sorted_topologically(td, cmp=issubclass), [numbers.Number, numbers.Integral, int])\n", |
| 221 | + "test_eq(sorted_topologically(td, cmp=issubclass, reverse=True), [int, numbers.Integral, numbers.Number])" |
| 222 | + ] |
| 223 | + }, |
| 224 | + { |
| 225 | + "cell_type": "code", |
| 226 | + "execution_count": null, |
| 227 | + "metadata": {}, |
| 228 | + "outputs": [], |
| 229 | + "source": [ |
| 230 | + "td = sorted_topologically([numbers.Integral, tuple, list, int, dict], cmp=issubclass)\n", |
| 231 | + "assert td.index(numbers.Integral) < td.index(int)" |
213 | 232 | ] |
214 | 233 | }, |
215 | 234 | { |
|
339 | 358 | " def __init__(self): self.d,self.cache = {},{}\n", |
340 | 359 | "\n", |
341 | 360 | " def _reset(self):\n", |
342 | | - " self.d = {k:self.d[k] for k in sorted(self.d, key=cmp_instance, reverse=True)}\n", |
| 361 | + " self.d = {k:self.d[k] for k in sorted_topologically(self.d, cmp=issubclass, reverse=True)}\n", |
343 | 362 | " self.cache = {}\n", |
344 | 363 | "\n", |
345 | 364 | " def add(self, t, f):\n", |
|
0 commit comments