Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def make_namedtuple_init(self, info: TypeInfo, items: List[str],
types: List[Type]) -> FuncDef:
args = [self.make_argument(item, type) for item, type in zip(items, types)]
# TODO: Make sure that the self argument name is not visible?
args = [Argument(Var('__self'), NoneTyp(), None, ARG_POS)] + args
arg_kinds = [arg.kind for arg in args]
signature = CallableType([cast(Type, None)] + types,
arg_kinds,
['__self'] + items,
NoneTyp(),
self.named_type('__builtins__.function'),
name=info.name())
func = FuncDef('__init__',
args,
Block([]),
typ=signature)
func.info = info
return func
def add_dummy_init_method(ctx: ClassDefContext) -> None:
any = AnyType(TypeOfAny.special_form)
pos_arg = Argument(variable=Var('args', any),
type_annotation=any, initializer=None, kind=ARG_STAR)
kw_arg = Argument(variable=Var('kwargs', any),
type_annotation=any, initializer=None, kind=ARG_STAR2)
add_method(ctx, '__init__', [pos_arg, kw_arg], NoneTyp())
# mark as model class
ctx.cls.info.metadata.setdefault('django', {})['generated_init'] = True
alternatives = set(original_type.type.names.keys())
matches = [m for m in COMMON_MISTAKES.get(member, []) if m in alternatives]
matches.extend(best_matches(member, alternatives)[:3])
if matches:
self.fail('{} has no attribute "{}"; maybe {}?'.format(
self.format(original_type), member, pretty_or(matches)), context)
failed = True
if not failed:
self.fail('{} has no attribute "{}"'.format(self.format(original_type),
member), context)
elif isinstance(original_type, UnionType):
# The checker passes "object" in lieu of "None" for attribute
# checks, so we manually convert it back.
typ_format = self.format(typ)
if typ_format == '"object"' and \
any(type(item) == NoneTyp for item in original_type.items):
typ_format = '"None"'
self.fail('Item {} of {} has no attribute "{}"'.format(
typ_format, self.format(original_type), member), context)
return AnyType()
return AnyType()
elif not isinstance(return_type, Instance):
# Same as above, but written as a separate branch so the typechecker can understand.
return AnyType()
elif return_type.type.fullname() == 'typing.Awaitable':
# Awaitable, AwaitableGenerator: tc is Any.
return AnyType()
elif (return_type.type.fullname() in ('typing.Generator', 'typing.AwaitableGenerator')
and len(return_type.args) >= 3):
# Generator: tc is args[1].
return return_type.args[1]
else:
# `return_type` is a supertype of Generator, so callers won't be able to send it
# values. IOW, tc is None.
if experiments.STRICT_OPTIONAL:
return NoneTyp(is_ret_type=True)
else:
return Void()
fixed = min(fixed, callee.max_fixed_args())
arg_type = None # type: Type
ctx = None # type: Type
for i, arg in enumerate(args):
if i < fixed:
if callee and i < len(callee.arg_types):
ctx = callee.arg_types[i]
arg_type = self.accept(arg, ctx)
else:
if callee and callee.is_var_arg:
arg_type = self.accept(arg, callee.arg_types[-1])
else:
arg_type = self.accept(arg)
if has_erased_component(arg_type):
res.append(NoneTyp())
else:
res.append(arg_type)
return res
def default(self, typ: Type) -> Type:
if isinstance(typ, UnboundType):
return AnyType()
elif isinstance(typ, ErrorType):
return ErrorType()
else:
if experiments.STRICT_OPTIONAL:
return UninhabitedType()
else:
return NoneTyp()
def make_optional(typ: MypyType) -> MypyType:
return UnionType.make_union([typ, NoneTyp()])
elif typ.type.fullname() == 'builtins.tuple':
return tuple_rprimitive # Varying-length tuple
elif typ.type in self.type_to_ir:
return RInstance(self.type_to_ir[typ.type])
else:
return object_rprimitive
elif isinstance(typ, TupleType):
# Use our unboxed tuples for raw tuples but fall back to
# being boxed for NamedTuple.
if typ.fallback.type.fullname() == 'builtins.tuple':
return RTuple([self.type_to_rtype(t) for t in typ.items])
else:
return tuple_rprimitive
elif isinstance(typ, CallableType):
return object_rprimitive
elif isinstance(typ, NoneTyp):
return none_rprimitive
elif isinstance(typ, UnionType):
assert len(typ.items) == 2 and any(isinstance(it, NoneTyp) for it in typ.items)
if isinstance(typ.items[0], NoneTyp):
value_type = typ.items[1]
else:
value_type = typ.items[0]
return ROptional(self.type_to_rtype(value_type))
elif isinstance(typ, AnyType):
return object_rprimitive
elif isinstance(typ, TypeType):
return object_rprimitive
elif isinstance(typ, TypeVarType):
# Erase type variable to upper bound.
# TODO: Erase to object if object has value restriction -- or union (once supported)?
assert not typ.values, 'TypeVar with value restriction not supported'
if isinstance(lvalue_type, PartialType) and lvalue_type.type is None:
# Try to infer a proper type for a variable with a partial None type.
rvalue_type = self.accept(rvalue)
if isinstance(rvalue_type, NoneTyp):
# This doesn't actually provide any additional information -- multiple
# None initializers preserve the partial None type.
return
if is_valid_inferred_type(rvalue_type):
var = lvalue_type.var
partial_types = self.find_partial_types(var)
if partial_types is not None:
if not self.current_node_deferred:
if experiments.STRICT_OPTIONAL:
var.type = UnionType.make_simplified_union(
[rvalue_type, NoneTyp()])
else:
var.type = rvalue_type
else:
var.type = None
del partial_types[var]
lvalue_type = var.type
else:
# Try to infer a partial type. No need to check the return value, as
# an error will be reported elsewhere.
self.infer_partial_type(lvalue_type.var, lvalue, rvalue_type)
elif (is_literal_none(rvalue) and
isinstance(lvalue, NameExpr) and
isinstance(lvalue.node, Var) and
lvalue.node.is_initialized_in_class):
# Allow None's to be assigned to class variables with non-Optional types.
rvalue_type = lvalue_type
def visit_unbound_type(self, t: UnboundType) -> Type:
if isinstance(self.s, ErrorType):
return ErrorType()
elif isinstance(self.s, NoneTyp):
if experiments.STRICT_OPTIONAL:
return AnyType()
else:
return self.s
elif isinstance(self.s, UninhabitedType):
return self.s
else:
return AnyType()