Productivity Actions¶
This category collects BetterPy features that streamline common editing and navigation workflows, helping you move faster through everyday Python tasks.
Copy Actions¶
Copy with imports¶
Copy with imports copies the selected Python code and prepends the import statements that are referenced inside that selection.
How to use it¶
Select Python code, then run Edit | Copy Special | Copy with Imports.
Notes¶
- The selected text is copied as-is, with only trailing whitespace trimmed.
- Import statements already inside the selection are not duplicated.
- The feature is gated by the Copy with imports setting under Settings | BetterPy | Productivity Actions | Copying.
Generate Actions¶
Generate class actions¶
Use BetterPy's Generate menu entries to scaffold common Python class shapes without leaving the editor. Each action inserts the class at the caret, adds any required imports, and selects the generated class name so you can rename it immediately.
Available generators¶
dataclassinserts a plain@dataclass.test classinserts a pytest class with one test, named from the first configuredpython_classesandpython_functionspatterns.frozen dataclass (kw_only)inserts@dataclass(frozen=True, kw_only=True).pydantic model (with config)inserts aBaseModelplus an emptyConfigDict().
How it behaves¶
- The actions are available from
Code | Generate(⌘N / Alt+Insert) in Python files. - The test-class action appears only when the current module or containing class matches the configured pytest collection naming. It uses the first configured class and function pattern when multiple patterns are present.
- Test classes are always inserted at module scope so pytest can discover them.
- Other generated classes are inserted into the surrounding class with matching indentation when the caret is inside a class body.
- When the file is missing imports such as
dataclass,BaseModel, orConfigDict, BetterPy adds them without duplicating existing imports. - After insertion, BetterPy selects the editable name: only the generated
Classsuffix for test classes, and the entire class name for other generators.
Examples¶
Placement rules¶
If the caret is between existing statements, BetterPy inserts the generated class at that position instead of always appending it to the end of the file. That makes it practical to scaffold nested helper classes exactly where you want them.
Documentation Enhancements¶
Inherited Attribute Documentation¶
Show an ancestor attribute's docstring in Quick Documentation when a subclass overrides the attribute without adding local documentation. PyCharm renders direct attribute docstrings natively; BetterPy only fills the inherited override gap.
How to invoke¶
Place the caret on an overriding class attribute and open Quick Documentation with F1 / Ctrl+Q or the usual editor documentation action.
Example¶
class HttpUser:
tasks = []
"""Collection of task classes that this user will run."""
class BooksAPI(HttpUser):
tasks = [CrudFlow]
Quick Documentation for BooksAPI.tasks keeps PyCharm's native BooksAPI header and shows the documentation inherited from HttpUser.tasks.
Notes¶
- A local attribute docstring always takes precedence and is rendered by PyCharm.
- Example-bearing inherited docstrings are handed to the separate Docstring Example Rendering feature.
- Existing Attribute Docstring in Quick Documentation preferences are migrated once to this feature.
Docstring Example Rendering¶
Renders doctests and fenced Python examples in Quick Documentation for Python docstrings, so runnable examples are easier to scan and copy.
How to invoke: F1 / Ctrl+Q on a documented function, class, or module.
Notes¶
- Doctest prompts and fenced Python blocks are rendered as Python code blocks.
- The rendered example includes a copy link that copies only executable input for doctest snippets.
- The feature is gated by the Docstring Example Rendering setting under Settings | BetterPy | Productivity Actions | Documentation.
Anonymous usage analytics (PostHog)¶
BetterPy can send anonymous usage analytics to PostHog when BetterPy analytics are enabled. The data helps prioritize feature work and catch broad product issues without collecting code, file paths, project names, or personal data.
What is collected¶
- BetterPy plugin version.
- IDE type and version.
- Operating system and JVM version.
- A random anonymous installation id.
- Coarse feature-usage events, such as a feature id and action id.
What is not collected¶
- Source code or snippets.
- File paths, project names, package names, or symbol names.
- Personal information.
How to control it¶
On first startup, BetterPy follows the IDE's usage statistics setting by default and shows a one-time notification with the opposite choice. You can change the BetterPy analytics setting later from Settings | BetterPy | Analytics & Privacy | Anonymous usage analytics (PostHog).