Get a signature for a callable.
(self, name: str, obj: Any)
| 80 | ) |
| 81 | |
| 82 | def _get_signature(self, name: str, obj: Any) -> Optional[Text]: |
| 83 | """Get a signature for a callable.""" |
| 84 | try: |
| 85 | _signature = str(signature(obj)) + ":" |
| 86 | except ValueError: |
| 87 | _signature = "(...)" |
| 88 | except TypeError: |
| 89 | return None |
| 90 | |
| 91 | source_filename: Optional[str] = None |
| 92 | try: |
| 93 | source_filename = getfile(obj) |
| 94 | except (OSError, TypeError): |
| 95 | # OSError is raised if obj has no source file, e.g. when defined in REPL. |
| 96 | pass |
| 97 | |
| 98 | callable_name = Text(name, style="inspect.callable") |
| 99 | if source_filename: |
| 100 | callable_name.stylize(f"link file://{source_filename}") |
| 101 | signature_text = self.highlighter(_signature) |
| 102 | |
| 103 | qualname = name or getattr(obj, "__qualname__", name) |
| 104 | if not isinstance(qualname, str): |
| 105 | qualname = getattr(obj, "__name__", name) |
| 106 | if not isinstance(qualname, str): |
| 107 | qualname = name |
| 108 | |
| 109 | # If obj is a module, there may be classes (which are callable) to display |
| 110 | if inspect.isclass(obj): |
| 111 | prefix = "class" |
| 112 | elif inspect.iscoroutinefunction(obj): |
| 113 | prefix = "async def" |
| 114 | else: |
| 115 | prefix = "def" |
| 116 | |
| 117 | qual_signature = Text.assemble( |
| 118 | (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), |
| 119 | (qualname, "inspect.callable"), |
| 120 | signature_text, |
| 121 | ) |
| 122 | |
| 123 | return qual_signature |
| 124 | |
| 125 | def _render(self) -> Iterable[RenderableType]: |
| 126 | """Render object.""" |