98647e83c7
This patch improves the builtin dir() function by probing the target object with all possible qstrs via mp_load_method_maybe. This is very simple (in terms of implementation), doesn't require recursion, and allows to list all methods of user-defined classes (without duplicates) even if they have multiple inheritance with a common parent. The downside is that it can be slow because it has to iterate through all the qstrs in the system, but the "dir()" function is anyway mostly used for testing frameworks and user introspection of types, so speed is not considered a priority. In addition to providing a more complete implementation of dir(), this patch is simpler than the previous implementation and saves some code space: bare-arm: -80 minimal x86: -80 unix x64: -56 unix nanbox: -48 stm32: -80 cc3200: -80 esp8266: -104 esp32: -64
39 lines
630 B
Python
39 lines
630 B
Python
# test builtin dir
|
|
|
|
# dir of locals
|
|
print('__name__' in dir())
|
|
|
|
# dir of module
|
|
import sys
|
|
print('exit' in dir(sys))
|
|
|
|
# dir of type
|
|
print('append' in dir(list))
|
|
|
|
class Foo:
|
|
def __init__(self):
|
|
self.x = 1
|
|
foo = Foo()
|
|
print('__init__' in dir(foo))
|
|
print('x' in dir(foo))
|
|
|
|
# dir of subclass
|
|
class A:
|
|
def a():
|
|
pass
|
|
class B(A):
|
|
def b():
|
|
pass
|
|
d = dir(B())
|
|
print(d.count('a'), d.count('b'))
|
|
|
|
# dir of class with multiple bases and a common parent
|
|
class C(A):
|
|
def c():
|
|
pass
|
|
class D(B, C):
|
|
def d():
|
|
pass
|
|
d = dir(D())
|
|
print(d.count('a'), d.count('b'), d.count('c'), d.count('d'))
|