为什么Python要在一个列表中串联字符串而不是迭代它们?

2024-05-17 10:11:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python CGI脚本中,我有字符串列表,这些字符串是散列的键:

APPENDIX_WEBSITES = ['CJSHayward']
MAIN_WEBSITES = ['Alfresco',
  'Bible',
  'Fathers',
  'MyCollab',
  'Koha',
  'MediaWiki',
  'Moodle',
  'RequestTracker',
  'SuiteCRM',
  'TikiWiki',
  'Wordpress']
# The variable "data" is populated with a hash containing all above entries as keys.
sys.stderr.write(repr(MAIN_WEBSITES) + '\n')
sys.stderr.write(repr(APPENDIX_WEBSITES) + '\n')
sys.stderr.write(repr(MAIN_WEBSITES + APPENDIX_WEBSITES) + '\n')
for website in MAIN_WEBSITES + APPENDIX_WEBSITES:
    sys.stderr.write(website)

Apache日志忠实地记录:

[Tue Aug 08 16:25:34.266769 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: ['Alfresco', 'Bible', 'Fathers', 'MyCollab', 'Koha', 'MediaWiki', 'Moodle', 'RequestTracker', 'SuiteCRM', 'TikiWiki', 'Wordpress']: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/
[Tue Aug 08 16:25:34.267050 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: ['CJSHayward']: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/
[Tue Aug 08 16:25:34.267268 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: ['Alfresco', 'Bible', 'Fathers', 'MyCollab', 'Koha', 'MediaWiki', 'Moodle', 'RequestTracker', 'SuiteCRM', 'TikiWiki', 'Wordpress', 'CJSHayward']: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/
[Tue Aug 08 16:25:34.267490 2017] [cgi:error] [pid 16429] [client 127.0.0.1:40600] AH01215: AlfrescoAlfrescoBibleBibleFathersFathersMyCollabMyCollabKohaKohaMediaWikiMediaWikiMoodleMoodleRequestTrackerRequestTrackerSuiteCRMSuiteCRMTikiWikiTikiWiki: /usr/local/websites/home/www/configure/index.cgi, referer: http://localhost/

我很惊讶,它似乎在单个字符串上迭代一次(列表的冗余串联),而不是在repr似乎识别为字符串列表的字符串上迭代,这正是我的意图。你知道吗

如何让循环通过“CJSHayward”遍历“Alfresco”、“Bible”等?你知道吗


Tags: 字符串mainstderrsyserroraugbiblewebsites
1条回答
网友
1楼 · 发布于 2024-05-17 10:11:45

正如评论员所指出的,您必须在\n后面附加一个换行符(website),以便每个网站在Apache日志中显示在自己的行上。你知道吗

for website in MAIN_WEBSITES + APPENDIX_WEBSITES:
    sys.stderr.write(website + '\n')

那将解决你的问题。但是,您可能有兴趣知道为什么这解决了问题。你知道吗

期望对sys.stderr.write的每个调用都会在日志中产生自己的行,这并不疯狂。这种情况之所以不是,是因为sys.stderr是一个流。流是对发送到某处的数据的抽象。在本例中,sys.stderr.write写入标准错误流,而Apache日志从标准错误流读取。Apache日志不知道您调用了sys.stderr.write多少次。它只知道在小溪里能看到什么。例如,Apache日志不可能知道

sys.stderr('HelloWorld')

以及

sys.stderr('Hello')
sys.stderr('World')

在这两种情况下,apachelog(以及其他从标准错误读取的应用程序)只看到字符流'HelloWorld'因此,Apache log必须使用换行符(\n)将标准错误流划分为单独的行。

相关问题 更多 >