python:两个"流体"相互依赖的变量

时间:2018-03-26 22:54:22

标签: python python-3.x

在我目前的剧本中:

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)

我正在写一个块来缩短消息的长度,(由于不和的消息长度限制)所以我​​写了一个起始字符串,(这是流动的,因为它返回他们的输入作为一部分字符串),一个中间的字符串,(它是输入数字的阶乘,如此流畅)和一个结束字符串(它告诉必须切掉多少个字符以适应消息限制,所以也是流畅的)。我的问题是,当计算要切断中间字符串的字符数量时,需要使用结束字符串的长度来查找所有三个字符串的总长度,并从中间字符串中删除多个字符。但是,要切除的这些字符数用于第三个字符串,因此这两个变量相互依赖。这不起作用,因为其中一个变量需要先定义,但不能,因为另一个变量不是。有没有什么办法解决这一问题?是我试图做的甚至可能吗?

提前谢谢

2 个答案:

答案 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)