5


2

Python boolを 'True’または 'False’ではなく 'On’または 'Off’に出力します

boolとまったく同じように機能するが、「True」または「False」ではなく「On」または「Off」を出力する変数を作成する最良の方法は何ですか? 現在、プログラムは「Color:True」を印刷していますが、「Color:On」はより意味があります。

記録のために、最初に bool`を継承する OnOff`クラスを作成しようとしました:

class OnOff(bool):
    def __str__(self):
        if self: return 'On'
        else: return 'Off'

コメントから、「bool」はシングルトンであることがわかりました。これが惨めに失敗した理由です。

Traceback (most recent call last):
    class OnOff(bool):
TypeError: Error when calling the metaclass bases
    type 'bool' is not an acceptable base type

12 Answer


18


print(" Off "、" On ")[value]`も動作します( `(False、True)==(0,1)


10


def Color(object):

    def __init__(self, color_value=False):
        self.color_value = color_value

    def __str__(self):
       if self.color_value:
          return 'On'
       else:
          return 'Off'

    def __cmp__(self, other):
        return self.color_value.__cmp__(other.color_value)

これはあなたにとってはやり過ぎかもしれませんが。 :)


5


私のお気に入りのトリックは、boolを使用して配列のインデックスを作成することです。

return "Color: {0}".format(['Off','On'][has_color])

警告は、値が「False」、「True」、「0」、または「1」でなければならないことです。 他に何かがある場合は、まずブール値に変換する必要があります。


4


print "On" if color else "Off"    # Python 2.x
print ("On" if color else "Off")  # Python 3.x


3


TrueとFalseはシングルトンです。 PythonにはTrueオブジェクトとFalseオブジェクトが1つだけあります。 結果として、それらから継承しようとすると問題が発生します。 (それらはそのように使用されることを意図していませんでした)。

論理的および/または操作をオーバーロードして、本当にブール型のオブジェクトを作成できないようにすることはできません。 常にPythonのboolに戻ります。

だからしないでください。

値をTrueおよびFalseとして印刷したくない場合は、それらに対して直接printを呼び出さないでください。 印刷は、迅速で汚れた出力用です。 さらに何かをしたいなら、それはあなたにもっと仕事をする必要があるでしょう。 この場合、必要なのはToOnOff関数だけです。


1


現在、https://stackoverflow.com/questions/3687109#3687134 [Rahul’s code]に基づいてこのソリューションを使用しています。

class OnOff(object):
    def __init__(self, value):
        self._value = value

    def __str__(self):
       if self._value: return 'On'
       else: return 'Off'

    def __cmp__(self, other):
        return self._value.__cmp__(other)

`cmp`関数を変更して、オブジェクトがブールと比較できるようにし、その他のマイナーなものも変更しました。 Rahulへの完全なクレジット。


0


mybool = {True: 'On', False: 'Off'}
mybool[True] == 'On'
mybool[False] == 'Off'


0


「print」を台無しにしたくない場合…​

class BoolHack(object):
    def __init__(self):
        from sys import stdout
        self.realout = stdout

    def write(self, text):
        if text == 'False':
            text = 'Off'
        elif text == 'True':
            text = 'On'
        self.realout.write(text)

import sys

sys.stdout = BoolHack()

print "Hello world" # ==> Hello world
print 1             # ==> 1
print True, 10      # ==> On 10
print False         # ==> Off
print "True hack"   # ==> True hack

WARNING Do not use in real production code! This is only for making 回答のセットが完了しました。

`print`はオブジェクトに対してstr()を呼び出して印刷し、その後に文字列を標準出力に配置します…​ そのため、オブジェクトのタイプをチェックすることはできません。 しかし、「False」または「True」を単一の文字列として印刷することは非常にまれなので、非常に特殊なケースでは機能する可能性があります。


0


class Color:
    def __init__(self,C):
    if C==True:
        self.col='On'
    else:
        self.col='Off'

    def __cmp__(self,other):
        return self.col


0


残念なことはできません True . str = lambda:" On "

残念ながら、それは読み取り専用であると文句を言います。 とにかく、それは非常にハック的な方法です。