'Force'Python评估所有布尔表达式

时间:2018-10-07 02:43:25

标签: python python-3.x boolean-expression

大多数语言都可以通过强制所有布尔值(如果要求值)来强制“及早且经常失败”。

假设我在Python中具有以下if语句:

if(age>100 or patient_is_brain_dead or patient_lacks_left_arm):
    do something...

问题是我可能忘记为'Patient_is_brain_dead或'has_no_left_arm'设置布尔值。

由于大多数在世的人都在100岁以下,因此测试2和3很少发生,因为Python看到“或”在前面,因此不再评估是否小于100岁以节省时间。

我的代码受计算量的限制很大,因此测试这三种情况的开销不会降低性能,但是会捕获很多潜在的错误,而这些错误可能会在每500个情况中发生一次。

有没有一种方法可以强迫Python对它们全部进行评估?不要建议取消顺序,因为根据用户的输入,任何情况都可能是罕见的情况。

2 个答案:

答案 0 :(得分:2)

我认为,您不应该想要在生产代码中执行此操作。如果几个变量应该为布尔型,并且您需要检查它们是否为assert all(isinstance(i, bool) for i in [patient_is_brain_dead, patient_lacks_left_arm]) if age > 100 or patient_is_brain_dead or patient_lacks_left_arm: # do something... ,则应该使用短路逻辑。

那么,如您所说,如果您想确保代码在边缘情况下不会失败,那您有什么选择呢?您可以使用unit testing测试所有可行的方案。但这对于您的用例而言可能是过大的。您可以只使用assert语句:

assert

这种解决方案的好处是可以通过命令行-Oturn off public interface IShape { double M1(); double M2(); } public abstract class Shape : IShape { public abstract double M1(); public abstract double M2(); } public class Circle : Shape { } public class Rectangle: Shape { } public interface IDrawer<T> where T:IShape { void Draw(T shape); } public abstract class BaseDrawer<T> : IDrawer<T> where T : IShape { public abstract void Draw(T shape); } public class CircleDrawer : BaseDrawer<Circle> { public override void Draw(Circle circle) { } } public class RectangleDrawer : BaseDrawer<Rectangle> { public override void Draw(Rectangle rectangle) { } } 条生产代码语句。同时,出于测试目的,您可以确保变量的类型正确。

答案 1 :(得分:0)

否,您需要明确检查dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' // https://mvnrepository.com/artifact/org.hibernate/hibernate-core compile group: 'org.hibernate', name: 'hibernate-core', version: '5.3.6.Final' // https://mvnrepository.com/artifact/mysql/mysql-connector-java compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.12' // https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0' // https://mvnrepository.com/artifact/javax.xml/jaxb-impl compile group: 'javax.xml', name: 'jaxb-impl', version: '2.1' // https://mvnrepository.com/artifact/org.openjfx/javafx-controls compile group: 'org.openjfx', name: 'javafx-controls', version: '11' } 。这不是这种语言的“回旋”方式。

如果您想在没有设置任何变量的情况下使条件失败,则可以使用None来检查它们是否不是all()

None