ESP8266学习笔记(二)Micropython和标准python的差异

标签:
it |
分类: MicroPython |
官方文档:http://docs.micropython.org/en/latest/esp8266/genrst/index.html
1,常量之后跟关键词必须用空格隔开
print(eval_r(‘1and 0’)不合法
2,unicode 如:print("\N{LATIN SMALL LETTER A}") 这样的写法不合法
3,在提示错误时,将self也当做一个参数
4,在多重继承的多态性的表现和标准python有差异,举例:
class Foo:
def __str__(self):
return “Foo”
class C(tuple,Foo):
pass
T=C((1,2,3))
print(T)
标准python返回“Foo”,而micropython返回“(1,2,3)”
5,没有实现__del__方法
所以无法实现析构函数
6,在多重继承的对象中,super()只调用第一个对象的父类,为了尽量简单而采用的深度优先策略。
7,在使用@property修饰符的方法里调用super(),只能返回,而不会返回正确的值。
class A:
@property
def p(self):
return
{"a":10}
class AA(A):
@property
def p(self):
return
super().p
a = AA()
print(a.p)
标准python返回{"a":10} ,而micropython返回
8,当使用*拆分函数参数时,如果不在参数的最后位置,会自动将拆分后的参数放到最后位置。
print(*(1,2),3)
准python返回(1,2,3)
,而micropython返回(3,1,2),关于拆分参数参考:http://www.jb51.net/article/92153.htm
9,不支持函数的用户自定义变量
def f():
Pass
F.x=0
print(f.x)
准python输出0 ,而micropython执行报错。
10,带有 yield
的generator(生成器)中的上下文管理(with),不会执行__exit__()调用
class foo(object):
def __enter__(self):
print('enter')
def __exit__(self,*args):
print('exit')
def bar(x):
with foo():
while True:
x += 1
yield x
def func():
g = bar(0)
for _ in range(3):
print(next(g))
>>> func()
标准python返回
enter
1
2
3
exit
Micropython返回
enter
1
2
3
11,包的__path__属性类型不同,标准python为列表,micropython为字符串
12,当load模块失败时,还是会注册成功(没测试成功!!!)
13,不支持名字空间用分隔符表示目录的包。不要将模块放到相同的名字空间下的不同目录,micropython推荐3个模块搜索目录:当前应用目录,用户目录,系统目录。
14,不支持嵌套触发异常
try:
raise TypeError
except TypeError:
raise ValueError
15,给异常赋变量
e = Exception()
e.x =0
16,while循环发生异常时,异常提示的行号因为代码优化会不准确。
17,如果继承Exception并调用Exception.__init__会引起TypeError异常
18,不支持bytearray列表的切片操作
19,不支持bytes
print(bytes(‘abc’,encoding=’utf8’))
20,不支持步长不等于1的byte数组取数切片操作
print(b’123’[0:3:2])
21,float的输出格式有不同。
22,有些情况无法转换成int类型
class A(int):
__add__ = lambda
self, other: A(int(self) + other)
a = A(42)
print(a+a)
标准python输出:84 ,micropython报错:TypeError: can't convert A to
int
23,to_byte的参数为float类型时得到错误的提示。
24,数列删除操作的步长只能为1
L= [1,2,3,4]
del L[0:4:2]
25,无法转换迭代到列表
L=[10,20]
L[0:1] = range(4)
标准python此时L为[0,1,2,3,20]
26,列表赋值的步长也只能是1
L= [1,2,3,4]
l[0:4:2] = [5,6]
27,UnicodeDecodeError不会引发异常
28,str.endswith(s,start)没有实现
29,不支持如print('{a[0]}'.format(a=[1,
2]))
30,str()不支持关键字参数
str(b'abc',encoding=’utf8’)
31,str.rsplit(None,n),不支持None作为第一个参数
32,str的子类的实例不能和str的实例比较
class S(str):
pass
s= S(‘hello’)
print(s=’hello’)
标准python为True,micropython为False
33,字符串切片的步长也只能为1
print('abcdefghi'[0:9:2])
34,元组切片步长也只能为1
35,无法查询int
import array
print(1 in array.array('B', b'12'))
36,Array的删除不支持
37,array的切片步长也必须是1
38,不支持collections的deque类
39,json模块如果对象不可序列化,不会抛出异常。
40,struct的pack函数不会检查参数是否有缺失(不会抛出异常)。
41,不能重载sys.stdin,sys.stdout,sys.stderr,因为这些都存放于只读存储中
Import sys
sys.stdin = None
总结下来,尽量不要使用复杂的语法,尽量不要用多重继承,总之Simple is the best。
本人的更多原创文章请加入个人微信公众号。