温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Mimic ++ operator for bookkeeping variable
python

python - 模拟++运算符用于簿记变量

发布于 2020-03-30 21:45:39

对于我的应用程序GUI(tkinter),我需要一个'bookkeeping'变量来保存UI小部件的当前行号。我不希望对行号进行硬编码,因为插入小部件会涉及重新编号其后的所有行号。在这种情况下,增量运算符(x++类似于C ++)将非常方便,因为在必要时递增变量将仅需要两个附加字符。但是,Python 不支持增量运算符

为了避免应在不同行上的元素之间的增量声明,我想出了以下解决方案,但我想知道还有什么替代方法:

rownums = list(range(100))
rowstay = lambda: rownums[0]        # Return current row number and stay on row.
rowmove = lambda: rownums.pop(0)    # Return current row number and move on to next.

print(f'Two items: {rowstay()}, {rowmove()}')
print(f'One item: {rowmove()}')
print(f'Two items: {rowstay()}, {rowmove()}')

例如(tkinter):

# Create some buttons.
mybutton1 = tkinter.button(master, 'Button on row 0')
mybutton2 = tkinter.button(master, 'Button on row 0')
mybutton3 = tkinter.button(master, 'Button on row 1')


# Place buttons (use mimicked increment 'operator').
mybutton1.grid(row=rowstay(), column=0)
mybutton2.grid(row=rowmove(), column=1)
mybutton3.grid(row=rowmove(), column=0)

哪些替代代码可以提供相同的功能?

查看更多

提问者
Jan-WillemL
被浏览
18
Jan-WillemL 2020-02-02 22:41

从评论和答案中,我了解到使用lambda进行变异并分配lambdas不是Pythonic。一些注释建议使用,+= 1但这正是我要避免的原因,因为每次变量应递增时都需要附加语句。具有高阶函数(或类)的解决方案++x代替x++

我的解决方案(次优,请在EDIT下查看更好的解决方案):

class BookkeepingVar():
    """ Variable with the ++-operator from C++ mimicked.

        Example:
        x = BookkeepingVar(0)
        y = x() + 1    # y = 1, x = 1 
        z = x(1) + 1   # z = 1, x = 2 
    """

    def __init__(self, start=0):
        self.var = [start]

    def __call__(self, incr=0):
        if incr:
            self.var.append(self.var[0] + incr)
            return self.var.pop(0)
        else:
            return self.var[0]

用法示例:

# Create some buttons.
mybutton1 = tkinter.button(master, 'Button on row 0')
mybutton2 = tkinter.button(master, 'Button on row 0')
mybutton3 = tkinter.button(master, 'Button on row 1')

# Place buttons.
row = BookkeepingVar(0)
mybutton1.grid(row=row(0), column=0)
mybutton2.grid(row=row(1), column=1)
mybutton3.grid(row=row(1), column=0)

请注意:

  1. 变量值没有上限(例如在lambda示例中)。
  2. 列表长度永远不会超过两个,因此我无法想象低效率pop()会带来问题。
  3. 该解决方案比模仿x++更通用一点,因为它还支持除1以外的增量。
  4. 该解决方案还支持减量(使用负参数)。
  5. __call__实现方法是为了使符号尽可能短。

编辑:

一个没有列表的更简单,更优雅的解决方案(用法相同):

class BookkeepingVar():
    """ Variable with the ++-operator from C++ mimicked.

        Example:
        x = BookkeepingVar(0)
        y = x() + 1    # y = 1, x = 1 
        z = x(1) + 1   # z = 1, x = 2 
    """
    def __init__(self, start=0):
        self.var = start

    def __call__(self, incr=0):
        self.var += incr
        return self.var - incr

编辑2
关于++xvs. x++(删除线)的评论。