Будет ли мой класс, написанный ниже, считаться правильным кодом - PullRequest
0 голосов
/ 29 февраля 2020

Мой вопрос не связан с проблемой или проблемой, с которой я сталкиваюсь. Мой вопрос касается «хороших практик» и даже больше: практики, которая имеет смысл. Я написал много скриптов на разных языках, и я знаком со стандартами кодирования PEP-8, поэтому я не прошу вас, ребята, взглянуть на мой код с этой точки зрения, а с практической точки зрения: смысл, или простая функция (с некоторыми, некоторыми, ** kwargs) также будет считаться хорошей в этом примере? Я выясняю, стоит ли мне больше работать с классами.

Спасибо, что нашли время прочитать мой пост. Всего наилучшего!

import pandas as pd
import numpy as np
import os
import re
import time

def reset_values_to_default():

    dict_of_values = {
        'FilePath' : 'C:/PythonProjects/Compare/output/ Report from 23-02-2020.xlsx',
        'Planned in period' : 0,
        'Backlog from last month' : 0,
        'Current planned date' : pd.to_datetime('01-01-' + pd.Timestamp.now().strftime('%Y')).date(),
        'Current month' : pd.Timestamp.now().month,
        'Days in current month' : pd.Timestamp.now().days_in_month,
        'Routing' : 1,
        'Feasible' : False,
        'Organization Name' : 'test_organization'
        }

    return dict_of_values

class planning:

    def __init__(self, parameters):
        name = 'create planning for: '

        self.parameters = parameters
        self.file_path = parameters['FilePath']
        self.routing = parameters['Routing']
        self.org_name = parameters['Organization Name']

        planning.get_main_data(self)

        if self.routing == 1:
            planning.standard_planning_route(self)
        elif self.routing == 2:
            planning.custom_planning(self)


        print(name, self.org_name)

    def standard_planning_route(self):
        print('activating variant 1')
        df = self.frame['ID']

    def custom_planning(self):
        print('activating variant 2')
        df = self.frame['ID']
        return df

    def get_main_data(self):
        if not os.path.exists(self.file_path):
            print('no input file found, quitting function')
            exit()
        else:
            self.frame = pd.read_excel(self.file_path, sheet_name='Master')
            #return self.frame


x = planning( reset_values_to_default() ).custom_planning()

print(x)

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Пара вещей.

В reset_values_to_default() вы можете сохранить pd.Timestamp.now() как переменную, а затем использовать ее в диктовке. Это крайний случай, но он не позволяет последующим вызовам на pd.Timestamp.now() перекрывать два разных месяца.


В классах первая буква должна быть заглавной.

class Planning:
    pass

Как упоминал @MatsLindh, kwargs будет лучше, чем диктат здесь. Или просто укажите в конструкторе только те параметры, которые вам нужны, поскольку вы все равно получите KeyError, если вы их не предоставите.

def __init__(self, file_path, routing, org_name):
    self.file_path = file_path
    self.routing = routing
    self.org_name = org_name

или kwargs

def __init__(self, **kwargs):
    self.file_path = kwargs['file_path']
    self.routing = kwargs['routing']
    self.org_name = kwargs['org_name']

# Planning(file_path='/path', routing='routes', org_name='stackoverflow')

Вы впервые устанавливаете переменные экземпляра вне метода __init__. Это не рекомендуется. И, похоже, вам не нужно хранить self.routing или self.file_path в любом случае. Вы можете сделать это:

def __init__(self, file_path, routing, org_name):
    self.org_name = org_name

    if not os.path.exists(file_path):
        print('No input file found. Exiting...')
        raise FileNotFoundError()
    self.frame = pd.read_excel(file_path, sheet_name='Master')
    print(f'Activating variant {routing}')
    self.df = self.frame['ID']

planning = Planning(reset_values_to_default())
print(planning.df)
0 голосов
/ 29 февраля 2020

Я бы порекомендовал вам использовать sys.exit, особенно если ваш код будет развернут в производственной среде. Кроме того, я бы рекомендовал использовать регистратор вместо операторов print logger . Кроме того, первая буква имени класса должна быть заглавной.

Также вы можете добавить некоторые комментарии, как показано ниже (вместо добавления их над функцией):

def get_main_data(self):
    '''
    Some comments here
    '''
    if not os.path.exists(self.file_path):
        print('no input file found, quitting function')
        exit()
    else:
        self.frame = pd.read_excel(self.file_path, sheet_name='Master')
        #return self.frame
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...