我想创建这个功能
crypto.X509Extension("issuerAltName",False,"email:"+"test")
这是我的代码:
>>> str(Link('Hello'))
'Hello'
>>> str(Link(1, Link(2)))
'1 -> 2'
>>> print(Link(1 / 2, Link(1 // 2)))
0.5 -> 0
>>> str(Link(Link(1, Link(2, Link(3))), Link(4, Link(5))))
'(1 -> 2 -> 3) -> 4 -> 5'
>>> print(Link(Link(Link(Link('Wow')))))
(((Wow)))
>>> print(Link(Link('a'), Link(Link('b'), Link(Link('c')))))
(a) -> (b) -> (c)
但是,为了完成最后三个doctests,我不知道该怎么做。 帮助!
def __str__(self):
result = ''
while self.rest is not Link.empty:
result += '{0} -> '.format(self.first)
self = self.rest
return result + '{0}'.format(self.first)
答案 0 :(得分:3)
看起来规则应该是如果列表的头部本身就是一个列表,则格式化该列表,并将其放在括号中。像这样:
first = '({0})'.format(self.first) if isinstance(self.first, Link) else first
result += '{0} -> '.format(first)
现在,避免在rest
上使用递归有点奇怪,但在first
上间接使用递归。 (这是'{0}'.format(…)
的作用 - 如果您尚未定义__format__
方法,则会调用您的__str__
方法。)
因此,假设这是一个赋值,如果赋值告诉您不使用递归,则需要将其转换为循环。另一方面,如果赋值不是为了避免递归,那么只对两者进行递归会简单得多:
first = str(self.first)
if isinstance(self.first, Link):
first = '({0})'.format(first)
if self.rest is Link.empty:
return first
return '{0} -> {1}'.format(first, self.rest)
作为旁注:这是一个股票计划练习很糟糕地移植到Python(这意味着你的老师要么不喜欢或不喜欢Python,这不是一个好兆头...),但它缺少一个片。
通常,您应该处理Link(1, 2)
与Link(1, Link(2))
不同的处理方式。 (在Lisp术语中,那是(1 . 2)
与(1 2)
的对比。)但是你没有给出测试的例子,因此不清楚你应该输出什么 对于前者。 Sp ...准备好标记为不读老师的想法,除非你想做这样的事情:
first = str(self.first)
if isinstance(self.first, Link):
first = '({0})'.format(first)
if self.rest is Link.empty:
return first
rest = str(self.rest)
if isinstance(self.rest, Link):
return '{0} -> {1}'.format(first, self.rest)
else:
# surely (1 2 . 3) is not the same list as (1 2 3) but the spec left it out?
return '{0} .. {1}'.format(first, self.rest)