任何类型变量的真实评估

时间:2018-06-02 20:06:28

标签: python numpy

无论变量是数组,列表,整数还是其他变量,如何只验证某个变量不是False?例如:

import numpy as np

a = 1
b = False
c = np.array([1, 2])

def myFunction(var):
    if var:
        print('var is something, but it's not False')

myFunction(a)
myFunction(b)
myFunction(c)

这将返回错误消息"具有多个元素的数组的真值是不明确的。使用a.any()或a.all()。"对于c。如果我使用var.all(),那么代码只能用于数组。必须有一些评估方法并不关心给出什么类型的变量。我知道我可以使用try,但是这需要多行代码,对于一个看似简单的任务来说似乎非常非Pythonic。

对于某些上下文,有时我只想执行一段代码,只要该变量实际上有一个值。如果它没有值,默认情况下它可能是False,那么我想执行一段不同的代码。

4 个答案:

答案 0 :(得分:1)

正如Stephen Rauch所说,也许是try

def myFunction(var):
    try:
        if var==False: #If raises an exception, will jump to except
            print("var is something, and it IS False")
        else:
            print("var is something, and it's not False")
    except:
        print("var is something, and it's not False")

答案 1 :(得分:1)

来自Python文档,https://docs.python.org/3.6/library/stdtypes.html#truth-value-testing

Any object [of builtin type] can be tested for truth value, 
for use in an if or while condition or as operand of the Boolean operations below.

By default, an object is considered true unless its class defines 
either a __bool__() method that returns False or a __len__() method 
that returns zero, when called with the object.

它列出了被视为false的各种内置对象:NoneFalse0[], {}`。

每个变量都有一个value,即引用一个对象。在Python中没有未初始化的变量。如果您尝试使用尚未分配的变量,您将获得NameError

None是一个很好的default值,例如:

def foo(x, y=None):
    if y is None:
       y = 'a special value'
    ...

numpy数组不是内置类型,并且不适用于此真值测试。 ndarray始终具有值。

以下是一些案例:

单个元素数组,无论维度(0,1,...)都适用于if

In [73]: if np.array([0]): print('yes')   # np.array(False), etc
In [74]: if np.array([1]): print('yes')
yes

但是多元素数组会产生ValueError,而不管值是什么:

In [75]: if np.array([1,2]): print('yes')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-75-1212b980c1b6> in <module>()
----> 1 if np.array([1,2]): print('yes')

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

空数组(0个元素)也是一种特殊情况:

In [77]: if np.array([]): print('yes')
/usr/local/bin/ipython3:1: DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.
  #!/usr/bin/python3

ValueError经常出现在SO上。通常它在:

if x<0:
   ...

其中x是一个数组。 <测试每个值,并生成一个布尔数组。 numpy在需要标量布尔值的上下文中出现此类数组时会引发该错误:ifandor

一种可能性是遵循is None测试:

if isinstance(y, np.ndarray):
    <specialized array testing>
elif y:
    <builtin False>
else:
    <truthy>

答案 2 :(得分:0)

试试这个:

AsyncLocal

答案 3 :(得分:0)

大!问题基本上是:在if语句中,如何对任何类型的变量进行True评估,以确保我还没有将该变量定义为false?这是一个非常简单的解决方案:

<!DOCTYPE html>
<html>
  <style>
    table, th, td {
      border: 5px solid White;
    }
    th {
      font-weight: bold;
    }
  </style>

  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
    </script>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js">
    </script>
    <script>
      // get the list of Open Projects for the Drop Down
      $(function() {
        google.script.run.withSuccessHandler(buildProjectList)
          .getProjects();
      });

      function buildProjectList(options) {
        var list = $('#projectList');
        list.empty();
        for (var i = 0; i < options.length; i++) {
          list.append('<option value="' + options[i] + '">' + options[i] + '</option>');
        }
      }

      // function called when a Project is selected from the Drop Down
      function showResults() {
        var selectedProject = $('#projectList').val();
        google.script.run.withSuccessHandler(displayTeams)
          .buildTeams(selectedProject);
        google.script.run.withSuccessHandler(drawChart)
          .buildChart(selectedProject); //THIS IS MY PROBLEM STATEMENT
      }

      // add the teams to the div
      function displayTeams(html) {
        console.log(“html: “ + html);
        $('div.results_div').html(html);
      }

      // add the chart to the div (I HOPE)
      google.charts.load('current', {'packages':['gantt']});

      function drawChart(chartData) {
        console.log("chart data: " + chartData); // chartData is missing here
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Task ID');
        data.addColumn('string', 'Task Name');
        data.addColumn('string', 'Resource');
        data.addColumn('date', 'Start Date');
        data.addColumn('date', 'End Date');
        data.addColumn('number', 'Duration');
        data.addColumn('number', 'Percent Complete');
        data.addColumn('string', 'Dependencies');

        data.addRows(chartData);

        var options = {
          height: 400,
          gantt: {
            trackHeight: 30
          }
        }

        var chart = new google.visualization.Gantt(document.getElementByClassName("chart_div"));

        chart.draw(data, options);
      }
    </script>
  </head>
  <body>
    Select a Project from this list<br><br>

    Projects:<br>
      <select onchange='showResults();' id="projectList" name="project"></select>
      <br>
    <div class="results_div"></div>
    <br>
    <div class="chart_div"></div>
  </body>
</html>

这似乎是最初问题的最简单的解决方案,但似乎有点被迫,可能会混淆后来读取代码的不同人。我认为在函数中默认将一些变量设置为False是不合适的。更好的解决方案是将它们设置为None。这允许以下解决方案:

def test(x):
  return type(x) != bool or x

if test(False):
    print('False will NOT cause execution')
else:
    print('False will NOT cause execution')

if test(True):
    print('True will cause execution')

if test(np.array([])):
    print('An empty array will cause execution')

if test(np.array([1, 2])):
    print('The test works for long arrays.')

print('\n')

在这种情况下,False将导致代码执行。这样做,只要我实际将该变量提供给我的函数,我的函数就可以激活某些代码。这两种解决方案都适用于任何规模的阵列,从而解决了两难问题。

解决了这个问题后,它让我想知道大多数人是如何做到的,以便只要提供某个变量,代码的某些部分就会运行。也许有更标准的解决方案。