大多数语言都可以通过强制所有布尔值(如果要求值)来强制“及早且经常失败”。
假设我在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对它们全部进行评估?不要建议取消顺序,因为根据用户的输入,任何情况都可能是罕见的情况。
答案 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
这种解决方案的好处是可以通过命令行-O
来turn 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