fix compat with Python 3.5.0

This commit is contained in:
Maximilian Hils 2016-12-28 13:39:27 +01:00
parent 8185cf2724
commit 0929e74b4e
2 changed files with 22 additions and 8 deletions

View File

@ -1,5 +1,4 @@
import typing
import sys
def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
@ -25,10 +24,11 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
typename = str(typeinfo)
if typename.startswith("typing.Union"):
if sys.version_info < (3, 6):
types = typeinfo.__union_params__
else:
try:
types = typeinfo.__args__
except AttributeError:
# Python 3.5.x
types = typeinfo.__union_params__
for T in types:
try:
@ -39,10 +39,11 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
return
raise e
elif typename.startswith("typing.Tuple"):
if sys.version_info < (3, 6):
types = typeinfo.__tuple_params__
else:
try:
types = typeinfo.__args__
except AttributeError:
# Python 3.5.x
types = typeinfo.__tuple_params__
if not isinstance(value, (tuple, list)):
raise e
@ -52,7 +53,11 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
check_type("{}[{}]".format(attr_name, i), x, T)
return
elif typename.startswith("typing.Sequence"):
T = typeinfo.__args__[0]
try:
T = typeinfo.__args__[0]
except AttributeError:
# Python 3.5.0
T = typeinfo.__parameters__[0]
if not isinstance(value, (tuple, list)):
raise e
for v in value:

View File

@ -1,5 +1,6 @@
import typing
import mock
import pytest
from mitmproxy.utils import typecheck
@ -57,3 +58,11 @@ def test_check_sequence():
typecheck.check_type("foo", [10, "foo"], typing.Sequence[int])
with pytest.raises(TypeError):
typecheck.check_type("foo", [b"foo"], typing.Sequence[str])
with pytest.raises(TypeError):
typecheck.check_type("foo", "foo", typing.Sequence[str])
# Python 3.5.0 only defines __parameters__
m = mock.Mock()
m.__str__ = lambda self: "typing.Sequence"
m.__parameters__ = (int,)
typecheck.check_type("foo", [10], m)