1

元の 2.7 コードは次のとおりです。

            myFile = open(prjFile, 'w+')
            myFile.write("""<VirtualHost 192.168.75.100:80>
    ServerName www.{hostName}
    ServerAlias {hostNameshort}.* www.{hostNameshort}.*
    DocumentRoot {prjDir}/html
    CustomLog \\|/usr/sbin/cronolog /var/log/httpd/class/{prjCode}/\{hostName}.log.%Y%m%d\" urchin"
</VirtualHost>""".format(hostName=hostName, hostNameshort=hostNameshort, prjDir=prjDir, prjCode=prjCode))
            myFile.close()

そして、これを行うことで2.4互換にしようとしています:

myFile = open(prjFile, 'w+')
myFile.write("""<VirtualHost 192.168.75.100:80>
    ServerName www.%(hostName)s
    ServerAlias %(hostNameshort).* www.%(hostNameshort)s.*
    DocumentRoot %(prjDir)s/html
    CustomLog \\|/usr/sbin/cronolog /var/log/httpd/class/prjCode}/\%(hostName)s.log.%Y%m%d\" urchin"
</VirtualHost>""" % ('hostName', 'hostNameshort', 'prjDir', 'prjCode'))
myFile.close()

しかし、私のエラーは

Traceback (most recent call last):
  File "testfunction.py", line 20, in <module>
    </VirtualHost>""" % ('hostName', 'hostNameshort', 'prjDir', 'prjCode'))
TypeError: format requires a mapping

私はここで答えを探しましたが、私がしようとしているものは何もうまくいかないようです。ここで何が間違っていますか?

4

3 に答える 3

5

エラーはすべてを示しています。マッピング ( )が必要なときにtupletoを渡しています。たとえば、次のようなものが必要です。__mod__dict

print """<VirtualHost 192.168.75.100:80>
    ServerName www.%(hostName)s
    ServerAlias %(hostNameshort)s.* www.%(hostNameshort)s.*
    DocumentRoot %(prjDir)s/html
    CustomLog \\|/usr/sbin/cronolog /var/log/httpd/class/prjCode}/\%(hostName)s.log.%%Y%%m%%d\" urchin"
</VirtualHost>""" % dict(hostName='foo',hostNameshort='bar',prjDir='baz')

他にやらなければならないことがいくつかありました。この行に追加する必要がありsました:

ServerAlias %(hostNameshort).* www.%(hostNameshort)s.*

そして%、パーセント記号をエスケープするために、最後の行でを 2 倍にする必要がありました'%Y%m%d'

于 2013-06-04T15:22:54.353 に答える
1

フォーマット文字列から名前を削除したり、そのデータを辞書としてフィードしたりできます%(hostNameshort)s%s

于 2013-06-04T15:24:06.983 に答える
0

文字列の名前を削除し、"%s" に置き換えてから、各変数をそれにマップします (必要に応じて繰り返します)。さらに、部品を削除または変更します

".log.%Y%m%d\"

それもマッピングしようとしていて、対応する値が見つからないためです

于 2013-06-04T15:31:37.990 に答える