我在github上写了一段软件。它基本上是一个带有一些额外功能的托盘图标。我想提供一段代码,而实际上并不需要让用户安装可选功能的本质依赖关系,而且我也不希望导入我不打算使用的东西,所以我认为这样的代码会“好的解决方案“:什么是Python导入和提供可选功能的好习惯?
---- IN LOADING FUNCTION ----
features = []
for path in sys.path:
if os.path.exists(os.path.join(path, 'pynotify')):
features.append('pynotify')
if os.path.exists(os.path.join(path, 'gnomekeyring.so')):
features.append('gnome-keyring')
#user dialog to ask for stuff
#notifications available, do you want them enabled?
dlg = ConfigDialog(features)
if not dlg.get_notifications():
features.remove('pynotify')
service_start(features ...)
---- SOMEWHERE ELSE ------
def service_start(features, other_config):
if 'pynotify' in features:
import pynotify
#use pynotify...
但是有一些问题。如果用户格式化他的机器并安装最新版本的操作系统并重新部署此应用程序,则功能会突然消失而不会发出警告。该解决方案是目前这款配置窗口:
if 'pynotify' in features:
#gtk checkbox
else:
#gtk label reading "Get pynotify and enjoy notification pop ups!"
但如果这是说,一个苹果,我怎么知道我不是在向用户发送关于白费力气寻找一个依赖他们可以永远填?
第二个问题是:
if os.path.exists(os.path.join(path, 'gnomekeyring.so')):
问题。我可以确定该文件始终在所有Linux发行版中都称为gnomekeyring.so吗?
其他人如何测试这些功能?与基本
try:
import pynotify
except:
pynotify = disabled
的问题是,代码是全球性的,这些可能会被周围散落并且即使用户不希望pynotify ....它无论如何加载。
那么人们认为解决这个问题的最好方法是什么?
我认为`除了ImportError`块需要设置`external_module = None`,或者当你试图在if块中访问它时你会得到一个`NameError`。 – abhishekmukherg 2015-04-01 17:28:47