这是什么"加入"在做什么?

时间:2016-08-21 23:26:16

标签: python list join expression

我刚刚通过pip安装了retext。我必须为它下载图标,但我发现它不起作用(菜单上没有图标),除非我运行" retext"在翻版文件夹中。

我试图解决它但我的python技能不是很强。

目前,我强制icon_path拥有我想要的路径。

#icon_path = 'icons/'
icon_path = '/usr/local/lib/python3.5/site-packages/retext/icons/'

有人可以告诉我这条线是如何工作的吗?

datadirs = [join(d, 'retext') for d in datadirs]

感谢。

import sys
import markups
import markups.common
from os.path import dirname, exists, join

from PyQt5.QtCore import QByteArray, QLocale, QSettings, QStandardPaths
from PyQt5.QtGui import QFont

app_version = "6.0.1"

settings = QSettings('ReText project', 'ReText')

if not str(settings.fileName()).endswith('.conf'):
        # We are on Windows probably
        settings = QSettings(QSettings.IniFormat, QSettings.UserScope,
                'ReText project', 'ReText')

datadirs = QStandardPaths.standardLocations(QStandardPaths.GenericDataLocation)
datadirs = [join(d, 'retext') for d in datadirs]

if sys.platform == "win32":
        # Windows compatibility: Add "PythonXXX\share\" path
        datadirs.append(join(dirname(sys.executable), 'share', 'retext'))

if '__file__' in locals():
        datadirs = [dirname(dirname(__file__))] + datadirs

#icon_path = 'icons/'
icon_path = '/usr/local/lib/python3.5/site-packages/retext/icons/'
for dir in datadirs:
        if exists(join(dir, 'icons')):
                icon_path = join(dir, 'icons/')
                break

1 个答案:

答案 0 :(得分:1)

这是os.path.join()

  

os.path.join(path, *paths)

     

智能地加入一个或多个路径组件。返回值是路径和*paths的任何成员的串联,在除了最后一个之外的每个非空部分之后只有一个目录分隔符(os.sep),这意味着结果将仅在分隔符中结束最后一部分是空的。如果组件是绝对路径,则抛弃所有先前的组件,并从绝对路径组件继续连接。

在此导入:

from os.path import dirname, exists, join

所以,有问题的一行:

datadirs = [join(d, 'retext') for d in datadirs]

[ ... ]是一个列表理解,用于构建应用于join(d, 'retext')列表中每个目录的datadirs结果列表。

所以,如果包含datadirs

['/usr/local/test', '/usr/local/testing', '/usr/local/tester']

然后:

[join(d, 'retext') for d in datadirs]

会产生:

['/usr/local/test/retext', '/usr/local/testing/retext', '/usr/local/tester/retext']

设置问题:

icon_path = '/usr/local/lib/python3.5/site-packages/retext/icons/'

是否在for循环中被覆盖,因此除非找不到合适的路径,否则它将被覆盖。