# Core


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

------------------------------------------------------------------------

### callable_name

``` python

def callable_name(
    c:Callable
)->str:

```

*Get the name of the callable `c`.*

<details open class="code-fold">
<summary>Exported source</summary>

``` python
def callable_name(c: Callable) -> str:
    "Get the name of the callable `c`."
    return getattr(c, '__name__', c.__class__.__name__)
```

</details>

This works for any function:

``` python
assert callable_name(max) == "max"
```

And for any classes:

``` python
class _A: pass
assert callable_name(_A) == "_A"
```

------------------------------------------------------------------------

### public_attrs

``` python

def public_attrs(
    o
):

```

*Retrieve the public attributes of the object `o`.*

<details open class="code-fold">
<summary>Exported source</summary>

``` python
def public_attrs(o):
    "Retrieve the public attributes of the object `o`."
    return [a for a in dir(o) if not a.startswith('_')]
```

</details>

`public_attrs` will hide any attribute on an object if it starts with an
underscore.

``` python
_A.print = print
_A._private_print = print
_A.__python_internal__ = print
assert public_attrs(_A) == ["print"]
```
