在Python2中重新定义`False`?如何将函数调用分配给变量名?

时间:2017-04-19 19:42:12

标签: python python-2.7 boolean

我没有特别希望这样做的原因,我只想偶尔看一下FalseTrue

import random
def dice():
    return random.randint(1,3)==2 
False = dice()

这不会给我我想要的东西 - 我想假在调用dice()时将False初始化为某个值,因此保留为其值。我怎样才能使每次检查False的值时,就好像我已经调用了dice()

如果有人有更好的方法来表达这一点,请随时提供编辑。感谢。

4 个答案:

答案 0 :(得分:2)

您无法在Python 2或3中执行此操作。您可以在Python 2中为False指定一个值,但您不能做的就是只读取普通变量的值( False或其他任何东西)调用函数。

如果您正在阅读的内容不是裸名变量,而是某种表达式(如属性访问权限),则可以执行此操作。也就是说,你可以这样做,使a.b之类的东西每次都评估为不同的值,但不是这样,只有普通的a每次都会评估为不同的值。

答案 1 :(得分:2)

要做到这一点,您需要更多地控制名称查找过程,而不是Python通常给您的。您需要在使用您控制的名称查找规则的命名空间中执行代码,这意味着您必须使用exec

import random

class WeirdLocals(dict):
    def __getitem__(self, index):
        if index == 'False':
            return random.choice([True, False])
        return super(WeirdLocals, self).__getitem__(index)

exec '''
print False # Might print True
print False # Might print True
print False # Might print True
''' in globals(), WeirdLocals()

请注意,exec中定义的函数将忽略提供的名称查找本地,即使您尝试使用奇怪的__getitem__覆盖提供全局字典,它们也可能会绕过它。< / p>

答案 2 :(得分:1)

如果你能忍受不得不使用。在你的变量名中,@ property的装饰器可以满足你的需要。

示例:

import random

class Foo:
     def __init__(self):
             pass
     @property
     def True(self):
             return random.choice([True,False,True])

然后如果你这样做

 F=Foo() 
 print(F.True) #will return True 66% of the time and False 33% of
 the time.

答案 3 :(得分:0)

只有错误才能做到这一点;如果您正在调用函数,则需要使用函数语法。你可以做到

False = dice
...
if my_value == False():
    ... action