Sample

pyint-5473842403c0-SRC

Unmodified source class

Lines270

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Dorn0.1050–1; higher is more readable
Mi0.5830–1; higher is more readable
LLOC73Logical lines; fewer is more readable
DeepSeek V4 Pro160–20; mean of three runs
GPT-6.1 Sol160–20; mean of three runs
BTTF0.4450–1; higher is more readable

Views

Source code

from __future__ import annotations import abc import contextlib import enum import itertools import linecache import sys import types import unicodedata import weakref from collections.abc import Callable, Mapping from functools import cached_property from typing import Any, NamedTuple, TypeVar from . import _compat, _config, setters from ._compat import ( PY_3_11_PLUS, PY_3_13_PLUS, _AnnotationExtractor, _get_annotations, _lazy_is_generator, get_generic_base, ) from .exceptions import ( DefaultAlreadySetError, FrozenInstanceError, NotAnAttrsClassError, UnannotatedAttributeError, ) class Attribute: """ *Read-only* representation of an attribute. .. warning:: You should never instantiate this class yourself. The class has *all* arguments of `attr.ib` (except for ``factory`` which is only syntactic sugar for ``default=Factory(...)`` plus the following: - ``name`` (`str`): The name of the attribute. - ``alias`` (`str`): The __init__ parameter name of the attribute, after any explicit overrides and default private-attribute-name handling. - ``alias_is_default`` (`bool`): Whether the ``alias`` was automatically generated (``True``) or explicitly provided by the user (``False``). - ``inherited`` (`bool`): Whether or not that attribute has been inherited from a base class. - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The callables that are used for comparing and ordering objects by this attribute, respectively. These are set by passing a callable to `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also :ref:`comparison customization <custom-comparison>`. Instances of this class are frequently used for introspection purposes like: - `fields` returns a tuple of them. - Validators get them passed as the first argument. - The :ref:`field transformer <transform-fields>` hook receives a list of them. - The ``alias`` property exposes the __init__ parameter name of the field, with any overrides and default private-attribute handling applied. .. versionadded:: 20.1.0 *inherited* .. versionadded:: 20.1.0 *on_setattr* .. versionchanged:: 20.2.0 *inherited* is not taken into account for equality checks and hashing anymore. .. versionadded:: 21.1.0 *eq_key* and *order_key* .. versionadded:: 22.2.0 *alias* .. versionadded:: 26.1.0 *alias_is_default* For the full version history of the fields, see `attr.ib`. """ # These slots must NOT be reordered because we use them later for # instantiation. __slots__ = ( # noqa: RUF023 "name", "default", "validator", "repr", "eq", "eq_key", "order", "order_key", "hash", "init", "metadata", "type", "converter", "kw_only", "inherited", "on_setattr", "alias", "alias_is_default", ) def __init__( self, name, default, validator, repr, cmp, # XXX: unused, remove along with other cmp code. hash, init, inherited, metadata=None, type=None, converter=None, kw_only=False, eq=None, eq_key=None, order=None, order_key=None, on_setattr=None, alias=None, alias_is_default=None, ): eq, eq_key, order, order_key = _determine_attrib_eq_order( cmp, eq_key or eq, order_key or order, True ) # Cache this descriptor here to speed things up later. bound_setattr = _OBJ_SETATTR.__get__(self) # Despite the big red warning, people *do* instantiate `Attribute` # themselves. bound_setattr("name", name) bound_setattr("default", default) bound_setattr("validator", validator) bound_setattr("repr", repr) bound_setattr("eq", eq) bound_setattr("eq_key", eq_key) bound_setattr("order", order) bound_setattr("order_key", order_key) bound_setattr("hash", hash) bound_setattr("init", init) bound_setattr("converter", converter) bound_setattr( "metadata", ( types.MappingProxyType(dict(metadata)) # Shallow copy if metadata else _EMPTY_METADATA_SINGLETON ), ) bound_setattr("type", type) bound_setattr("kw_only", kw_only) bound_setattr("inherited", inherited) bound_setattr("on_setattr", on_setattr) bound_setattr("alias", alias) bound_setattr( "alias_is_default", alias is None if alias_is_default is None else alias_is_default, ) def __setattr__(self, name, value): raise FrozenInstanceError @classmethod def from_counting_attr( cls, name: str, ca: _CountingAttr, kw_only: bool, type=None ): # The 'kw_only' argument is the class-level setting, and is used if the # attribute itself does not explicitly set 'kw_only'. # type holds the annotated value. deal with conflicts: if type is None: type = ca.type elif ca.type is not None: msg = f"Type annotation and type argument cannot both be present for '{name}'." raise ValueError(msg) return cls( name, ca._default, ca._validator, ca.repr, None, ca.hash, ca.init, False, ca.metadata, type, ca._converter, kw_only if ca.kw_only is None else ca.kw_only, ca.eq, ca.eq_key, ca.order, ca.order_key, ca.on_setattr, ca.alias, ca.alias is None, ) # Don't use attrs.evolve since fields(Attribute) doesn't work def evolve(self, **changes): """ Copy *self* and apply *changes*. This works similarly to `attrs.evolve` but that function does not work with :class:`attrs.Attribute`. It is mainly meant to be used for `transform-fields`. .. versionadded:: 20.3.0 """ import copy new = copy.copy(self) new._setattrs(changes.items()) if "alias" in changes and "alias_is_default" not in changes: # Explicit alias provided -- no longer the default. _OBJ_SETATTR.__get__(new)("alias_is_default", False) elif ( "name" in changes and "alias" not in changes # Don't auto-generate alias if the user picked picked the old one. and self.alias_is_default ): # Name changed, alias was auto-generated -- update it. _OBJ_SETATTR.__get__(new)( "alias", _default_init_alias_for(new.name) ) return new # Don't use _add_pickle since fields(Attribute) doesn't work def __getstate__(self): """ Play nice with pickle. """ return tuple( getattr(self, name) if name != "metadata" else dict(self.metadata) for name in self.__slots__ ) def __setstate__(self, state): """ Play nice with pickle. """ if len(state) < len(self.__slots__): # Pre-26.1.0 pickle without alias_is_default -- infer it # heuristically. state_dict = dict(zip(self.__slots__, state, strict=False)) alias_is_default = state_dict.get( "alias" ) is None or state_dict.get("alias") == _default_init_alias_for( state_dict["name"] ) state = (*state, alias_is_default) self._setattrs(zip(self.__slots__, state, strict=True)) def _setattrs(self, name_values_pairs): bound_setattr = _OBJ_SETATTR.__get__(self) for name, value in name_values_pairs: if name != "metadata": bound_setattr(name, value) else: bound_setattr( name, ( types.MappingProxyType(dict(value)) if value else _EMPTY_METADATA_SINGLETON ), )

Loading feature diagnosis…

Source regions

Feature contributions

Feature contributions

FeatureValueContribution
(log-odds)
Halstead volumeHow much symbolic information the code contains. It combines the total number of operators and values with the number of distinct ones.5522.817−182.253
Source linesThe number of non-empty source lines.270+108
Byte entropyHow varied the bytes in the source text are. Repeated bytes give a lower value; a more even mixture gives a higher value.4.383−6.575

Intercept 8.87 + feature contributions = -71.958 (log-odds).
Score = sigmoid(-71.958) = 0.

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.271−8.559
Indentation frequencyHow rapidly indentation changes from line to line.196+6.042
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.196−4.077
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.269.957+3.364
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.90.978+0.663
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.041+0.541
Identifier layout (horizontal)How rapidly the visual pattern of identifier characters changes from left to right. It measures spatial frequency, not the meaning of the names.90.956−0.187

Intercept 0.07 + feature contributions = -2.143 (log-odds).
Score = sigmoid(-2.143) = 0.105.

Score0.583
Score73
Run 1

The code is well-structured and organized, with clear class boundaries and logical method ordering. Imports are comprehensive and properly segmented. Documentation is thorough, though verbose, which aids clarity but increases length. Nesting is minimal - only a few conditional blocks exist, mostly flat with clear early returns. Intent is explicit throughout, with descriptive variable names and comments explaining non-obvious operations. However, some methods are long (particularly __init__) with repetitive bound_setattr calls, and the number of parameters creates complexity. Action granularity is generally good - one operation per line in most places - but the __init__ method's repetitive assignments could be refactored. Reading flow is natural, following a logical progression from initialization to methods. The code is slightly verbose in documentation but maintains high readability overall. Some complexity exists around attr alias handling and evolution logic that requires careful reading.

Run 2

The code is generally well-structured and readable. It uses clear class-level docstrings, logical slot ordering, and concise helper methods. The __init__ method is long but flat, with one action per line and explicit comments explaining non-obvious logic. Methods like evolve and __setstate__ isolate complex behavior cleanly. Minor deductions come from dense parameter lists and a few compact conditional expressions that slightly reduce clarity, but overall the code is maintainable and intent is clear.

Run 3

The code is generally well-structured and readable, with clear class documentation, logical organization, and consistent naming. The Attribute class has a clear purpose, and methods like evolve, __getstate__, and _setattrs are reasonably concise. However, there are readability challenges: the __init__ method has a large number of parameters (some with unclear or deprecated names like 'cmp'), and it performs many sequential bound_setattr calls that could be grouped. The from_counting_attr method contains moderate nesting and conditional logic. Comments are helpful but sparse in places. Overall, the code is above average in clarity but slightly verbose in spots.

Run 1

Code Structure: Methods are logically organized around initialization, copying, serialization, and internal updates, with helpful documentation. Nesting: Mostly flat, with only shallow conditionals and loops. Clarity of intent: Descriptive method names and comments explain immutability, metadata handling, and compatibility behavior; descriptor manipulation, external helpers, and the long positional constructor call require extra effort to understand. Code length: Generally justified, though extensive documentation and repetitive attribute assignments make the class lengthy. Action granularity: Almost every statement performs one action, with clear separation of assignments and checks. Reading flow: Consistent formatting and focused methods support natural reading, but multiline conditional expressions, slot-order dependence, and positional argument mapping interrupt the flow.

Run 2

Code Structure: Logically organized around a single class, with separate methods for construction, copying, serialization, and internal updates. Nesting: Mostly flat, with only shallow loops and conditionals; multiline conditional expressions introduce some complexity. Clarity of intent: Descriptive method names, detailed documentation, and explanatory comments clarify behavior, though low-level descriptor usage, external helpers, and the unused cmp parameter require additional context. Code length: Generally justified by functionality, but extensive documentation, repetitive field assignments, and the large constructor increase reading effort. Action granularity: Consistently performs one action per statement, with no compressed multi-action lines. Reading flow: Methods follow a sensible progression and formatting is consistent, but the long positional constructor call, slot-order dependency, and awkwardly wrapped compatibility expression interrupt otherwise natural reading.

Run 3

Code Structure: Methods are logically separated into initialization, construction, copying, serialization, and internal mutation, with useful documentation. Nesting: Mostly flat control flow; limited conditionals and loops keep complexity manageable. Clarity of intent: Descriptive method names, comments, and docstrings explain immutability and compatibility behavior, but descriptor binding, external helpers, and the long positional constructor call require extra effort to understand. Code length: Repetitive field assignments and extensive documentation increase length, though much of this supports explicitness and public API documentation. Action granularity: Statements generally perform one action each; tuple unpacking and conditional expressions remain reasonably focused. Reading flow: Consistent formatting and method grouping support natural progression, but multiline expressions in state restoration, order-dependent slots, and numerous constructor parameters interrupt scanning. Overall, readable and well organized, with some complexity from low-level implementation details and backward compatibility.