Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否将格式字符串从%更改为替换字符?_Python - Fatal编程技术网

Python 是否将格式字符串从%更改为替换字符?

Python 是否将格式字符串从%更改为替换字符?,python,Python,在Python2.6中,是否有一种方法可以为字符串格式化操作指定除%以外的其他字符?或者%char是在python解释器中硬编码的 例如,要生成如下所示的字符串: param1%02param2%03param3... 我目前必须这样做: str = "%s%%02%s%%03%s" % (param1, param2, param3) 我希望能够做的是,用“^”代替%,并能够做到: str = "^s%02^s%03^s" ^ (param1, param2, param3) 哪个IMO

在Python2.6中,是否有一种方法可以为字符串格式化操作指定除%以外的其他字符?或者%char是在python解释器中硬编码的

例如,要生成如下所示的字符串:

param1%02param2%03param3...
我目前必须这样做:

str = "%s%%02%s%%03%s" % (param1, param2, param3)
我希望能够做的是,用“^”代替%,并能够做到:

str = "^s%02^s%03^s" ^ (param1, param2, param3)

哪个IMO更具可读性。

%
是硬编码的。然而,你可以做一些像

your_str = ("%s^02%s^03%s" % (param1, param2, param3)).replace("^", "%")
>>> '{0}%02{1}%03{2}'.format('a', 'b', 'c')
'a%02b%03c'

>>> '{param1} is also {param2}'.format(param1='foo', param2='bar')
'foo is also bar'

>>> '{0[name]} is {0[age]} years old'.format({'name': 'Bob', 'age': 42})
'Bob is 42 years old'


你不能——它甚至不是用python硬编码的,而是在libc(低于解释器的级别)中硬编码的。您可以编写一个函数,用
^
将字符串转换为
%
,并将现有的
%
转换为
%
,然后将其传递给格式化。

您可以使用新的
str.format
方法。它提供了更多的格式选项,更具可读性

>>> '{0}%02{1}%03{2}'.format('a', 'b', 'c')
'a%02b%03c'

>>> '{param1} is also {param2}'.format(param1='foo', param2='bar')
'foo is also bar'

>>> '{0[name]} is {0[age]} years old'.format({'name': 'Bob', 'age': 42})
'Bob is 42 years old'

有关更多信息,请查看文档:

我完全同意JBernardo的回答,但是,为了完整性,我只想指出,确实可以根据提问者的需要调整语言。这涉及从
str
派生类并重写其
^
运算符:

class yourstr(str):
    def __xor__(self, tuple):
        return self.replace("%", "%%").replace("^", "%") % tuple
然后,您可以执行以下操作:

>>> param1 = "foo"
>>> param2 = "bar"
>>> param3 = "quux"
>>> yourstr("^s%02^s%03^s") ^ (param1, param2, param3)
'foo%02bar%03quux'

但是,我不建议在一般情况下这样做,因为这样会使代码更难阅读和维护。

为了提高可读性而更改语言语法会适得其反,因为代码的其他读者根本无法阅读它。考虑其他让它更可读的方法!为什么不为分隔符使用一个不同于%0的字符,然后在格式化后用%0替换该序列,例如,
str=“%s | 2%s | 3%s”%(param1,param2,param3)
str=str.replace('|','%0')
@Dani-您应该看看实际有哪些代码。我给出的代码示例中的
%
符号不需要转义;它们是应该被替换的地方。替换发生在替换之后。我更喜欢
join
方法,因为它不会吹走
^
,它可能正确地位于
param
变量之一…向str.format()欢呼。我相信''join()从来就不是为了服务于这种格式化目的。为了简单地将一系列项连接在一起,
join()
完全是为了这个目的。不,不是。格式化代码是Python的一部分;参见stringobject.c中的PyString_格式。libc与Python字符串有什么关系?@Franklin:libc过去在Python字符串格式背后做了很多工作。我完全同意你的看法。这无疑是目前格式化字符串的最佳方法,因为%运算符已被弃用。这根本不能回答问题。当然,新的格式字符串语法很好,但我怀疑从C继承的旧语法是否适用。此外,新的语法只会使问题加倍,现在您必须转义
{
}
。@Matt真正起作用的东西并不能回答这个问题??问题在于
%
而不是
{
}
。仅仅因为你不喜欢正确的东西并不意味着你应该否决它。@Matt顺便说一句,如果您不喜欢新语法,您应该远离python,因为Python3上的
%
操作符已被弃用。我不认为在python的未来版本中描述为可能消失的旧式字符串格式是停止使用Python3的原因。我可能会提到,我只使用Python3,并为此付费,而且两种格式都不喜欢。