Рубрики
Без рубрики

Главные выводы DeepCode#7: Python Используйте реальное подразделение

Язык: Дефект Python: DivisionRounding Диагностика: Использование // вместо / чтобы убедиться, что значение – ROU … Tagged с помощью DeepCode, Staticcodeanalysis, Python.

Язык: Python Дефект: Разделение Диагностика: Используйте // вместо / Чтобы убедиться, что значение округлено до целого числа, а не фракционно. % function% ожидает Int в качестве первого аргумента.

Этот пример спонсируется Tensorflow/Models И вы можете следовать, загрузив его в приборную панель на DeepCode.ai

Я был очарован этим, так как это показывает разницу между Python 2.7 и 3. На фрагменте кода ниже показаны интересные части.

...
 def take_action(self, current_node_ids, action, step_number):
...
    goal_number = step_number / self.task_params.num_steps
    ...
      if n == self.episode.goal_node_ids[goal_number][i]:
    ...

Step_number и self.task_params.num_steps оба целых числа. В Python 2.7, оператор дивизии / Работает в качестве подразделения пола. Но разделение целых чисел всегда приведет к целому числу.

Python 2.7.16 (default, Jul 13 2019, 16:01:51)
[GCC 8.3.0] on linux
> 3/4
0
> 9/10
0

Это больше не верно для Python 3.

Python 3.7.4 (default, Jul  9 2019, 00:06:43)
[GCC 6.3.0 20170516] on linux
> 3/4
0.75
> 9/10
0.9
> 4/2
2.0

Увидеть разницу? В Python 3 деление ведет себя по -разному, поэтому вы должны быть осторожны. Разделение между двумя целыми числами приводит к количеству плавающей точки, даже если нет остатка. То, что DeepCode сделал под капотом, было анализом типа, и он выяснил, что ogle_number это номер с плавающей точкой. Это отслеживало ogle_number к его определению и обнаружил, что это является результатом разделения двух целых чисел. Но позже он используется в качестве параметра для оператора индекса, который должен быть целым числом. Если программа вызывает индекс-оператор с Float, это приводит к TypeError Анкет DeepCode выучился из сканирования тысяч репо с открытым исходным кодом, что обычно это должно было быть реальным подразделением пола // Вместо подразделения / Анкет И это происходит довольно часто, когда портирует код с Python 2.7 в Python 3.

Python 3.7.4 (default, Jul  9 2019, 00:06:43)
[GCC 6.3.0 20170516] on linux
> table = [1,2,3,4,5,6,7,8,9,10]
> a = 30
> b = 10
> table[a/b]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers or slices, not float
> table[a//b]
4

Чтобы «моделировать» поведение Python 2.7, вы можете использовать оператор дивизии пола // Анкет

Python 3.7.4 (default, Jul  9 2019, 00:06:43)
[GCC 6.3.0 20170516] on linux
> 3//4
0
> 9//10
0

Не уверен, что это все еще интересно, но в Python 2.7 // Работает на целых числах, как и ожидалось, так что это безопасно использовать.

Оригинал: “https://dev.to/deepcode/deepcode-s-top-findings-7-python-use-real-floor-division-4jkf”