0

目標
新しい項目を追加できるメニューを保存する練習スクリプトを作成しようとしています。項目は「戦闘アニメーション」「文字速度」「字幕」などです。メニューはすべての項目をこのように出力します (すべての項目の間隔が最大のものに合うように調整されていることに注意してください)。

| border color |
| (black) blue red green |
| Text Speed |
| slow (medium) fast |
図1

私のメソッド
MenuItem自体はクラスです。メニュー項目の内容を管理し、印刷時に必要な調整スペースを保存します。このクラスは、それ自体で完全に機能します。上記の 2 つのアイテムが MenuItem クラスのメソッドのみを使用して作成および印刷された場合、これらは次のようになります | border color |
| (black) blue red green |
| Text Speed |
| slow (medium) fast |

Menuメニュー項目を保存し、図 1 のように印刷されるように間隔の値を調整するために作成したクラスです。

My Code
このコードは、再現可能なエラーのみを表示するように削減されました。値リスト (黒、青、赤、緑など) は含まれません。
#!/usr/bin/env python3

class Menu(object):
    class MenuItem(object):
        def __init__(self, propertyTitle):
            self.title = propertyTitle
            self.printsize = (len(self.title)+4)

        def printMenuItem(self):
            f_indent = 2;
            f_title = ((' '*f_indent)+ self.title.ljust(self.printsize-f_indent))
            print('|',f_title ,'|',sep='')

    def __init__(self):
        self.width = 0;
        self.items = [];

    def addItem(self, pTitle):
        f_menuItem = Menu.MenuItem(pTitle)
        if(f_menuItem.printsize < self.width):
        #if(f_menuItem.printsize < 5):
            #adjusting padding on the smaller new menu item
            f_menuItem.printsize = self.width
        elif(f_menuItem.printsize > self.width):
        #elif(f_menuItem.printsize > 5):
            #adjusting padding on all past menu items to fit this new big item
            self.width = f_menuItem
            for x in self.items:
                x.printsize = self.width
        self.items.append(f_menuItem)
    def printMenu(self):
        for x in self.items:
            x.printMenuItem()

print()

property_1_title = "border color";
property_2_title = "text speed";

myMenu = Menu()
#myMenu.items.append(myBorderColor)
#myMenu.items.append(myTextSpeed)
myMenu.addItem(property_1_title);
myMenu.addItem(property_2_title);
myMenu.printMenu()

問題
次のエラーが表示されます。

line 20, in addItem
if(f_menuItem.printsize < self.width):
TypeError: '<' not supported between instances of 'int' and 'MenuItem'

line 24, in printMenuItem
f_title = ((' '*f_indent)+ self.f_title.ljust(self.printsize-f_indent))
TypeError: unsupported operand type(s) for -: 'MenuItem' and 'int'

何らかの理由で、Python は MenuItem のクラス属性 (int) を MenuItem 自体のクラス インスタンスとして解釈しています。少なくともそれが私がエラーを解釈した方法です。
このエラーの奇妙な点は、Menu クラスのメソッドが、内部に保存されている MenuItem インスタンスで MenuItem メソッドを呼び出した場合にのみ発生することです。
前に述べたように、MenuItem クラスが定義され使用されている唯一のクラスである場合、これらのエラーは発生しません。
(また、MenuItem が Menu 内のクラスとして定義されているか、Menu の前に別のクラスとして定義されているかは関係ありません。同じエラーが発生します)

あなたへの私の質問

Pythonが int ではなく MenuItem として解釈するのはなぜf_menuItem.printsizeですか? これを回避するために、プログラムを構成する別の方法をおそらく見つけることができます。しかし、それは単なる練習スクリプトです。このエラーを作成するために何が起こっているのかを知りたいだけです。self.printsize

4

1 に答える 1