New Command: Difference between revisions
Jump to navigation
Jump to search
PedroLacerda (talk | contribs) No edit summary |
PedroLacerda (talk | contribs) No edit summary |
||
| Line 1: | Line 1: | ||
IN ACTIVE DEVELOPMENT | IN ACTIVE DEVELOPMENT | ||
[[new_command]] is | [[new_command]] is a new API-only feature which exposes a developer defined Python function as a command to other users. | ||
== In a brief == | == In a brief == | ||
| Line 10: | Line 10: | ||
from pymol import cmd | from pymol import cmd | ||
from pathlib import Path | from pathlib import Path | ||
from typing import List, Tuple, Union, Any | from typing import List, Tuple, Union, Any, Optional | ||
Point = Tuple[float, float, float] | Point = Tuple[float, float, float] | ||
| Line 20: | Line 20: | ||
title: str, | title: str, | ||
other_point: Tuple[int, int, int] = (0, 0, 0), | other_point: Tuple[int, int, int] = (0, 0, 0), | ||
dirname: Path = '.', | dirname: Path = Path('.'), | ||
this_list: | this_list: Optional[List[bool]] = None, | ||
extended_calculation: bool = True, | extended_calculation: bool = True, | ||
old_style: Any = " | old_style: Any = "anything as string", | ||
quiet: bool = 1, # special 'quiet=False' on command-line | quiet: bool = 1, # special 'quiet=False' on command-line | ||
_self=cmd # special for multi-threaded applications | _self=cmd # special for multi-threaded applications | ||
): | ): | ||
"A cool docstring." | "A cool docstring." | ||
print(this_list) | print(locals()) | ||
</source> | |||
These code blocks ahead are sample usage of the above function. | |||
<source lang=sh> | |||
PyMOL> nice_tool 10, 0.1 2.3 4.5, Have a nice tool, this_list=1 0 yes 0 | |||
</source> | |||
<source lang=python> | |||
{'my_var': 10, 'a_point': (0.1, 2.3, 4.5), 'title': 'Have a nice tool', 'other_point': (0, 0, 0), 'dirname': PosixPath('.'), 'this_list': [True, False, True, False], 'extended_calculation': True, 'old_style': 'anything as string', 'quiet': False, '_self': <module 'pymol.cmd' from '/home/peu/Desktop/pymol-open-source/modules/pymol/cmd.py'>} | |||
</source> | </source> | ||
Revision as of 13:56, 29 November 2025
IN ACTIVE DEVELOPMENT
new_command is a new API-only feature which exposes a developer defined Python function as a command to other users.
In a brief
If you need more examples, here a non exhaustive list of examples: [1]
from pymol import cmd
from pathlib import Path
from typing import List, Tuple, Union, Any, Optional
Point = Tuple[float, float, float]
@cmd.new_command
def nice_tool(
my_var: Union[int | float],
a_point: Point,
title: str,
other_point: Tuple[int, int, int] = (0, 0, 0),
dirname: Path = Path('.'),
this_list: Optional[List[bool]] = None,
extended_calculation: bool = True,
old_style: Any = "anything as string",
quiet: bool = 1, # special 'quiet=False' on command-line
_self=cmd # special for multi-threaded applications
):
"A cool docstring."
print(locals())
These code blocks ahead are sample usage of the above function.
PyMOL> nice_tool 10, 0.1 2.3 4.5, Have a nice tool, this_list=1 0 yes 0
{'my_var': 10, 'a_point': (0.1, 2.3, 4.5), 'title': 'Have a nice tool', 'other_point': (0, 0, 0), 'dirname': PosixPath('.'), 'this_list': [True, False, True, False], 'extended_calculation': True, 'old_style': 'anything as string', 'quiet': False, '_self': <module 'pymol.cmd' from '/home/peu/Desktop/pymol-open-source/modules/pymol/cmd.py'>}
Details
It improves on extend, the consolidated exposing mechanism, and works by parsing arguments given by users at command-line, enforcing correct types at runtime, freeing developers from it and ensuring typing strictness. It is also advantageous for developers consuming the exposed function/command directly by the API as types can also be enforced statically by MyPy.