Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# abstract.PyTDFunction.match_args checks the args for this call.
self.match_args(node, args)
# namedtuple only has one signature
sig, = self.signatures
callargs = {name: var for name, var, _ in sig.signature.iter_args(args)}
# The name of the namedtuple class is the first arg (a Variable)
# We need the actual Variable later, so we'll just return name_var and
# extract the name itself later.
name_var = callargs["typename"]
# The fields are also a Variable, which stores the field names as Variables.
# Extract the list itself, we don't need the wrapper.
fields_var = callargs["field_names"]
fields = abstract_utils.get_atomic_python_constant(fields_var)
# namedtuple fields can be given as a single string, e.g. "a, b, c" or as a
# list [Variable('a'), Variable('b'), Variable('c')].
# We just want a list of strings.
if isinstance(fields, (bytes, six.text_type)):
fields = compat.native_str(fields)
field_names = fields.replace(",", " ").split()
else:
field_names = [abstract_utils.get_atomic_python_constant(f)
for f in fields]
field_names = [compat.native_str(f) for f in field_names]
# namedtuple also takes a "verbose" argument, but we don't care about that.
# rename will take any problematic field names and give them a new name.
# Like the other args, it's stored as a Variable, but we want just a bool.
if callargs.get("rename", None):
if not options.quick:
maximum_depth = MAXIMUM_DEPTH
elif options.analyze_annotated:
# Since there's no point in analyzing annotated functions for inference,
# the presence of this option means that the user wants checking, too.
maximum_depth = QUICK_CHECK_MAXIMUM_DEPTH
else:
maximum_depth = QUICK_INFER_MAXIMUM_DEPTH
tracer.exitpoint = tracer.analyze(loc, defs, maximum_depth)
else:
tracer.exitpoint = loc
snapshotter.take_snapshot("analyze:infer_types:post")
ast = tracer.compute_types(defs)
ast = tracer.loader.resolve_ast(ast)
if tracer.has_unknown_wildcard_imports or any(
a in defs for a in abstract_utils.DYNAMIC_ATTRIBUTE_MARKERS):
try:
ast.Lookup("__getattr__")
except KeyError:
ast = pytd_utils.Concat(
ast, builtins.GetDefaultAst(options.python_version))
# If merged with other if statement, triggers a ValueError: Unresolved class
# when attempts to load from the protocols file
if options.protocols:
protocols_pytd = tracer.loader.import_name("protocols")
else:
protocols_pytd = None
builtins_pytd = tracer.loader.concat_all()
# Insert type parameters, where appropriate
ast = ast.Visit(visitors.CreateTypeParametersForSignatures())
if options.protocols:
log.info("=========== PyTD to solve =============\n%s",
def _get_value_info(self, inner, ellipses):
if ellipses:
# An ellipsis may appear at the end of the parameter list as long as it is
# not the only parameter.
return super(Tuple, self)._get_value_info(
inner, ellipses, allowed_ellipses={len(inner) - 1} - {0})
else:
template = list(moves.range(len(inner))) + [abstract_utils.T]
inner += (self.vm.merge_values(inner),)
return template, inner, abstract.TupleClass
def call(self, node, func, args):
if self.vm.PY3:
# In Python 3, the type of IO object returned depends on the mode.
self.match_args(node, args) # May raise FailedFunctionCall.
sig, = self.signatures
try:
mode = get_file_mode(sig, args)
except abstract_utils.ConversionError:
pass
else:
# The default mode is 'r'.
io_type = "Binary" if "b" in mode else "Text"
return node, self.vm.convert.constant_to_var(abstract_utils.AsInstance(
self.vm.lookup_builtin("typing.%sIO" % io_type)), {}, node)
return super(Open, self).call(node, func, args)
def call(self, node, func, args):
if self.vm.PY3:
# In Python 3, the type of IO object returned depends on the mode.
self.match_args(node, args) # May raise FailedFunctionCall.
sig, = self.signatures
try:
mode = get_file_mode(sig, args)
except abstract_utils.ConversionError:
pass
else:
# The default mode is 'r'.
io_type = "Binary" if "b" in mode else "Text"
return node, self.vm.convert.constant_to_var(abstract_utils.AsInstance(
self.vm.lookup_builtin("typing.%sIO" % io_type)), {}, node)
return super(Open, self).call(node, func, args)
# _make
# _make is a classmethod, so it needs to be wrapped by
# specialibuiltins.ClassMethodInstance.
# Like __new__, it uses the _Tname TypeVar.
sized_cls = self.vm.convert.name_to_value("typing.Sized")
iterable_type = abstract.ParameterizedClass(
self.vm.convert.name_to_value("typing.Iterable"),
{abstract_utils.T: field_types_union}, self.vm)
cls_type = abstract.ParameterizedClass(
self.vm.convert.type_type,
{abstract_utils.T: cls_type_param}, self.vm)
len_type = abstract.CallableClass(
self.vm.convert.name_to_value("typing.Callable"),
{0: sized_cls,
abstract_utils.ARGS: sized_cls,
abstract_utils.RET: self.vm.convert.int_type},
self.vm)
params = [
Param("iterable", iterable_type),
Param("new").unsolvable(self.vm, node),
Param("len", len_type).unsolvable(self.vm, node)]
make = overlay_utils.make_method(
self.vm, node,
name="_make",
params=params,
self_param=Param("cls", cls_type),
return_type=cls_type_param)
make_args = function.Args(posargs=(make,))
_, members["_make"] = self.vm.special_builtins["classmethod"].call(
node, None, make_args)
# _replace
def starstarargs_as_dict(self):
try:
args = self.starstarargs and abstract_utils.get_atomic_python_constant(
self.starstarargs, dict)
except abstract_utils.ConversionError:
args = None
return args
Args:
node: The current CFG node.
name_var: Class name.
bases: Base classes.
class_dict_var: Members of the class, as a Variable containing an
abstract.Dict value.
cls_var: The class's metaclass, if any.
new_class_var: If not None, make_class() will return new_class_var with
the newly constructed class added as a binding. Otherwise, a new
variable if returned.
Returns:
A node and an instance of Class.
"""
name = abstract_utils.get_atomic_python_constant(name_var)
log.info("Declaring class %s", name)
try:
class_dict = abstract_utils.get_atomic_value(class_dict_var)
except abstract_utils.ConversionError:
log.error("Error initializing class %r", name)
return self.convert.create_new_unknown(node)
# Handle six.with_metaclass.
metacls, bases = self._filter_out_metaclasses(bases)
if metacls:
cls_var = metacls
# Flatten Unions in the bases
bases = [self._process_base_class(node, base) for base in bases]
if not bases:
# Old style class.
bases = [self.convert.oldstyleclass_type.to_variable(self.root_cfg_node)]
if (isinstance(class_dict, abstract.Unsolvable) or
def _load_all_formal_type_parameters(self):
"""Load _all_formal_type_parameters."""
if self._all_formal_type_parameters_loaded:
return
bases = [
abstract_utils.get_atomic_value(
base, default=self.vm.convert.unsolvable) for base in self.bases()]
for base in bases:
abstract_utils.parse_formal_type_parameters(
base, self.full_name, self._all_formal_type_parameters)
self._all_formal_type_parameters_loaded = True