def _prefix(value):
     if isinstance(value, types.MethodType):
         name = describe(None, value.__self__, verbose=True) + "."
     else:
         module = inspect.getmodule(value)
         if module is not None and module.__name__ != "builtins":
             name = module.__name__ + "."
         else:
             name = ""
     return name
예제 #2
0
 def info(self):
     result = "an instance of "
     for klass in self.klasses:
         if isinstance(klass, str):
             result += klass
         else:
             result += describe("a", klass)
         result += " or "
     result = result.strip(" or ")
     if self.allow_none:
         result += " or None"
     return result
예제 #3
0
    def describe(article, value, name=None, verbose=False, capital=False):
        """Return string that describes a value
        Parameters
        ----------
        article : str or None
            A definite or indefinite article. If the article is
            indefinite (i.e. "a" or "an") the appropriate one
            will be infered. Thus, the arguments of ``describe``
            can themselves represent what the resulting string
            will actually look like. If None, then no article
            will be prepended to the result. For non-articled
            description, values that are instances are treated
            definitely, while classes are handled indefinitely.
        value : any
            The value which will be named.
        name : str or None (default: None)
            Only applies when ``article`` is "the" - this
            ``name`` is a definite reference to the value.
            By default one will be infered from the value's
            type and repr methods.
        verbose : bool (default: False)
            Whether the name should be concise or verbose. When
            possible, verbose names include the module, and/or
            class name where an object was defined.
        capital : bool (default: False)
            Whether the first letter of the article should
            be capitalized or not. By default it is not.
        Examples
        --------
        Indefinite description:
        >>> describe("a", object())
        'an object'
        >>> describe("a", object)
        'an object'
        >>> describe("a", type(object))
        'a type'

        Definite description:
        >>> describe("the", object())  # doctest: +ELLIPSIS
        "the object at '0x...'"
        >>> describe("the", object)
        'the object object'
        >>> describe("the", type(object))
        'the type type'

        Definitely named description:
        >>> describe("the", object(), "I made")
        'the object I made'
        >>> describe("the", object, "I will use")
        'the object I will use'
        """
        if isinstance(article, str):
            article = article.lower()

        if not inspect.isclass(value):
            typename = type(value).__name__
        else:
            typename = value.__name__
        if verbose:
            typename = _prefix(value) + typename

        if article == "the" or (article is None and not inspect.isclass(value)):
            if name is not None:
                result = "{} {}".format(typename, name)
                if article is not None:
                    return add_article(result, True, capital)
                else:
                    return result
            else:
                tick_wrap = False
                if inspect.isclass(value):
                    name = value.__name__
                elif isinstance(value, types.FunctionType):
                    name = value.__name__
                    tick_wrap = True
                elif isinstance(value, types.MethodType):
                    name = value.__func__.__name__
                    tick_wrap = True
                elif type(value).__repr__ in (object.__repr__, type.__repr__):
                    name = "at '%s'" % hex(id(value))
                    verbose = False
                else:
                    name = repr(value)
                    verbose = False
                if verbose:
                    name = _prefix(value) + name
                if tick_wrap:
                    name = name.join("''")
                return describe(article, value, name=name,
                    verbose=verbose, capital=capital)
        elif article in ("a", "an") or article is None:
            if article is None:
                return typename
            return add_article(typename, False, capital)
        else:
            raise ValueError("The 'article' argument should "
                "be 'the', 'a', 'an', or None not %r" % article)