【发布时间】:2019-04-02 03:42:46
【问题描述】:
我不是专业的编码员,但我不时使用 Python 来满足我的科学需求。所以我想了解什么是最 Pythonic 的方式来执行以下操作:
我正在使用一个已经存在的模块,那里的某些类看起来像那样
class ATS(Instrument):
def __init__(self, ..., dll_path: str):
...
self._dll = ctypes.cdll.LoadLibrary(dll_path)
...
def _call_dll(self, func_name: str, *args) -> None:
func = getattr(self._dll, func_name)
output = func(*args)
...
发现需要使用不同的DLL来调用自己的函数(可惜不同DLL中的函数名可以相同)。
问题是:修改 _call_dll 函数以明确指定我想使用哪个 DLL 来调用特定函数的最 Pythonic 方式是什么。同时,我想保持其余代码的可操作性,其中使用了旧版本的_call_dll。
我看到了几种方法来做到这一点,但我不确定哪一种是最专业和最好的。
为我想使用的每个
dll_n创建自己的_call_dll_n函数,但它不够紧凑和美观。-
在函数名前加一些前缀来指定DLL,比如
class ATS(Instrument): def __init__(self, ..., dll_path, dll_path_1, ...): ... self._dll = ctypes.cdll.LoadLibrary(dll_path) self._dll_1 = ctypes.cdll.LoadLibrary(dll_path_1) ... def _call_dll(self, pre_func_name: str, *args) -> None: if prefix_func_name[:5] == 'dll_1': dll = self._dll_1 func_name = pre_func_name[5:] func = getattr(dll, func_name) ... else: dll = self._dll # Default DLL. func_name = pre_func_name -
制作 my_call_dll:
def _my_call_dll(self, func_name: str, dll = None, *args)) if dll is None: self._call_dll(self, func_name, *args) else: dll_bckp = self._dll self._dll = dll self._call_dll(self, func_name, *args) self._dll = dll_bckp
感谢您对这个特定示例的帮助,但也非常欢迎您提供有关如何工作和修改已存在的函数/类的更一般性的想法。
【问题讨论】:
-
原始模块版本的源代码是否受控(例如是否来自Github)?
-
是的,它来自 github,但我更喜欢拥有自己的模块版本(老实说,我只是不确定我的修改是否以适当的方式与他人分享) .
-
“我发现需要使用不同的dll来调用自己的函数”;您能否在说明中添加另一段,解释什么条件决定了在给定场合使用哪个 DLL?
标签: python coding-style