Язык: 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”