Python: sqlalchemy schema 的结果不是预期的。

10 浏览
0 Comments

Python: sqlalchemy schema 的结果不是预期的。

repr():一个对象的可执行字符串表示形式(可以“eval()”它,这意味着它是一种字符串表示形式,可以转换为Python 对象)

换句话说:

>>> x = 'foo'
>>> repr(x)
"'foo'"

问题:

  1. 我为什么在执行repr(x)时会得到双引号?(而当我执行str(x)时不会得到它们)
  2. 当我执行eval(\"\'foo\'\")时为什么会得到\'foo\'而不是 x 这个对象?
admin 更改状态以发布 2023年5月21日
0
0 Comments

你在交互式解释器上得到的反馈也使用了repr。当你输入一个表达式(比如expr),解释器基本上会执行result=expr;if result is not None: print repr(result)。所以你的例子的第二行是将字符串foo格式化为你想要的表示形式('foo')。然后解释器创建它的repr表示形式,留下你的双引号。

为什么当我将%r与双引号和单引号转义组合在一起并打印出来时,它打印出来的方式是我在.py文件中写的方式,而不是我想要看到的方式?

我不确定你在这里问什么。当运行repr的文本single ' and double " quotes,就会包括一种引号的转义。当然,它会这样做,否则按照Python规则,它不会成为一个有效的字符串字面值。这正是你通过调用repr要求的。

还要注意,eval(repr(x)) == x的比喻并不是字面意思。这是一个近似值,对于大多数(全部?)内置类型都是成立的,但主要的是你从repr输出中可以得到类型和逻辑“值”的相当好的概念。

0
0 Comments

>>> x = 'foo'
>>> x
'foo'

因此,名称x与字符串'foo'关联。例如,当您调用repr(x)时,解释器会将'foo'代替x,然后调用repr('foo')

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

repr实际上调用x的魔术方法__repr__,它提供了包含赋给x的值'foo'的表示形式的字符串。因此它返回加引号的字符串"'foo'"repr的思想是为我们提供一个包含一系列符号的字符串,我们可以在解释器中输入该字符串,以获得与传递给repr的参数相同的值。

>>> eval("'foo'")
'foo'

当我们调用eval("'foo'")时,就相当于在解释器中输入'foo'。这就好像我们在解释器中直接输入了外部字符串""的内容。

>>> eval('foo')
Traceback (most recent call last):
  File "", line 1, in 
    eval('foo')
  File "", line 1, in 
NameError: name 'foo' is not defined

如果我们调用eval('foo'),就相当于在解释器中输入foo。但是,没有可用的foo变量,因此会引发异常。

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

str只是对象的字符串表示形式(记住,x变量引用了'foo'),因此此函数返回字符串。

>>> str(5)
'5'

整数5的字符串表示形式是'5'

>>> str('foo')
'foo'

字符串'foo'的字符串表示形式是相同的字符串'foo'

0