Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metelskiy Ivan #14

Open
wants to merge 43 commits into
base: master
Choose a base branch
from

Conversation

DanoryHub
Copy link

No description provided.

HIGHEST_PRIORITY = 4

RE_MAIN_PARSE_ARG = re.compile(r'\d+[.]\d+|\d+|[+,\-*^]|[/=!<>]+|\w+|[()]')
#
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для чего тут пустые комментарии?

import pycodestyle
from typing import Any

pycodestyle.maximum_line_length = 120
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в данном случае лучше передавать такие настройки напрямую утилите pycodestyle, без подстройки этой конфигурации в самом калькуляторе

for import_elem in usr_imports:
import_objects[import_elem] = importlib.import_module(import_elem)

globals().update(import_objects)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опасный подход с хранением импортированных объектов напрямую в глобальной секции. Намного лучше будет хранить эти объекты в отдельном словаре (либо что-то другое, но точно не стоит хранит это в globals)

import_objects = dict()

for import_elem in usr_imports:
import_objects[import_elem] = importlib.import_module(import_elem)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import_objects = {import_elem: importlib.import_module(import_elem) for import_elem in usr_imports}

:param methods: dictionary which contains objects of methods of imports
:return: number by its type
"""
if not type(item) is str:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if not isinstance(item, str)

globals().update(import_objects)


def _get_item_by_type(item: str, methods: dict) -> Any:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Одна точка выхода из функции обычно лучше, чем несколько. В данном случае можно сделать только один return в функции без особых усилий и читаемость кода не пострадает.

:param unit: name of unit as string
:return: dictionary which contains name of attribute as key and it object as value
"""
attrs = tuple([i for i in dir(globals()[unit])])
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В данном случае сначала создается список, а потом приводится к кортежу :) Созание списка в этом случае абсолютно бесполезно.

attrs = tuple(i for i in dir(globals()[unit]))

И снова, советую совсем избавиться от globals

if ex_str.count('(') != ex_str.count(')'):
raise Exception('brackets are not balanced')

while re.compile(r'[+][-]|[-][+]').findall(ex_str):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Регулярные выражения лучше выносить с отдельные переменные с говорящим названием.

:param expression: mathematical operator
:return: priority of given operator as integer
"""
if expression == constants.lowest_priority_operator:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как вариант, хранение обозначения оператора и его приоритет можно связать в какую-то общую структуру.
либо можно сделать удобный мапинг в виде словаря, который позволит избавиться от цепочки конструкций elif

return packed_expression


def _priority(expression: str) -> int:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_get_priority

return -1


def polish_notation(expression_list: list, methods: dict) -> list:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Название функции/метода должно обозначать действие

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я насчитал в этой функции 14 операторов условий, что на самом деле очень много. Если есть возможность "без боли" разбить эту функцию на несколько маленьких, то это бы значительно упростило понимание кода.


class calculator:

def __init__(self, user_imports=[]):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не стоит использовать список как значение по умолчанию для аргумента функции:)
Дефолтные значения создаются единожды во время создания объекта функции, а не при каждом вызове функции, что может привести к неожиданным багам))

polish_list = logic.polish_notation(normal_list, self._methods)
return logic.ex_calc(polish_list, self._methods)
except Exception as ex:
print('Error: {}\n'.format(ex))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

На CI проверяется, что ошибка начинается с ERROR: (большимим буквами)

pycodestyle.maximum_line_length = 120


class calculator:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

На самом деле это бесполезный класс, всю его функциональность можно оформить в функцию

found_func = False
params_list.append(one_param_list)
one_param_list = []
for list in params_list:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

list уже есть в built-in
Нужно дать другое имя переменной, чтобы не было перекрытия

@DanoryHub DanoryHub changed the title [WIP] Metelskiy Ivan Metelskiy Ivan May 1, 2019


def parse_funcs_params(ex_list: list, methods: dict) -> list:
"""

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можешь взглянуть на библиотеку typing. Она позволяет более явно указывать содержимое коллекций.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants