在我目前的剧本中:
topfactorial = str(facorialmath2)
start = "%s! = "%(factnum)
if len(start) + len(topfactorial) > 2000:
end = " and %s more digits"%(2000-msglen)
msglen = 2000 - len(end) - len(start)
topfacotial = topfactorial[:msglen]
msg = start+topfacotial+end.format(message)
else:
msg = start+topfactorial.format(message)
await client.send_message(message.channel, msg)
我正在写一个块来缩短消息的长度,(由于不和的消息长度限制)所以我写了一个起始字符串,(这是流动的,因为它返回他们的输入作为一部分字符串),一个中间的字符串,(它是输入数字的阶乘,如此流畅)和一个结束字符串(它告诉必须切掉多少个字符以适应消息限制,所以也是流畅的)。我的问题是,当计算要切断中间字符串的字符数量时,需要使用结束字符串的长度来查找所有三个字符串的总长度,并从中间字符串中删除多个字符。但是,要切除的这些字符数用于第三个字符串,因此这两个变量相互依赖。这不起作用,因为其中一个变量需要先定义,但不能,因为另一个变量不是。有没有什么办法解决这一问题?是我试图做的甚至可能吗?
提前谢谢
答案 0 :(得分:0)
免责声明:绝对有更明智的方法可以做到这一点。
def truncate(s, limit=2000):
if len(s) <= limit:
return s
addition = ' + {} characters'
start = limit - len(addition)
display = s[:start]
remainder = len(s[start:])
for i in range(start, 0, -1):
candidate = display + addition.format(remainder)
if len(candidate) <= limit:
return candidate
display = display[:-1]
remainder += 1
raise ValueError('String too big to fit in message')
答案 1 :(得分:0)
这不是最干净的方式,而是把它放到一个循环中直到它的大小合适。为了测试,我做了一些小改动。在尝试定义消息长度并创建一个take变量来计算所采用的数量之前,您需要定义所有内容。如果消息在长度内,它将自动保持为0.循环将继续从topfactorial开始直到消息长度与最大长度匹配。它也考虑到了两位数,并将删除正确的金额。
topfactorial = str(facorialmath2)
start = "%s! = "%(factnum)
taken = 0
end = " and %s more digits"%(taken)
message = start+topfactorial
maxlen = 2000
msglen = len(message)
if msglen > maxlen:
while msglen > maxlen:
taken += 1
truncfactorial = topfactorial[:len(topfactorial)-taken]
start = "%s! = "%(factnum)
end = " and %s more digits"%(taken)
message = start+truncfactorial+end
msglen = len(message)
await client.send_message(message.channel, message)
else:
await client.send_message(message.channel, message)