2013-04-29 11 views
6

Piszę aplikację kolby, i znalazłem, że mam mnóstwo ogólnych funkcji użytkowych.Python - Najlepsze miejsce do ogólnych funkcji

Oto przykłady rodzajów funkcji, które uważam za ogólne funkcje użytkowe:

def make_hash(): 
    return defaultdict(make_hash) 

def file_read(filename): 
    with open(file_name_, 'r') as f: 
    return f.read() 

def file_write(filename, data): 
    with open(filename, 'w') as f: 
    f.write(data) 

Myślałam o podrzucając te funkcje w osobnym module razem. Jednak jestem ciekawy, czy mam następujące obawy:

  • Istnieje kilka unikalnych funkcji, które gwarantują oddzielny moduł razem. tj. powyższe funkcje file_read i file_write mogą zostać umieszczone w module file.py, jednak ze względu na dwie funkcje czuję, że może to być przesada.
  • W mojej aplikacji używam tych funkcji 2-3 razy na funkcję, więc poruszam się pod pozorem, że tworzenie tych funkcji użyteczności powinno pomóc mi zapisać pewne linie kodu, i mam nadzieję, że sprawi, że będę bardziej wydajny.

Pytanie: - Jaki byłby pytoniczny sposób grupowania ogólnych funkcji użytkowych? Czy powinienem utworzyć osobny moduł? Ciekawe, co robią inni, aby zorganizować ten rodzaj kodu.

Odpowiedz

2

Nie sądzę, że ma to wiele wspólnego z Pythonem, to bardziej decyzja projektowa.

Tylko dla tych linii nie tworzyłbym osobnego modułu; jednak jeśli użyjesz go 2 do 3 razy, nie skopiowałbym kodu. Jeśli później chcesz coś zmienić, potrzebujesz tylko jednej zmiany, zachowując spójność funkcjonalności.

Również metody wydają się bardzo ogólne, więc można je później łatwo wykorzystać w innych projektach.

Zakładam, że chcesz, aby były statyczne (@static_method).

To, co robię, to grupowanie ogólnych klas użytkowych według typów, tzn. W twoim przypadku jeden plik dla słowników (z jedną metodą) i jedną dla pliku (z 2 metodami). Później możliwe będzie dodanie większej liczby metod, ale funkcjonalność jest pogrupowana według typu/użycia.

+1

Ma to sens. Byłem niechętny, aby umieścić to w klasie tylko dlatego, że mam (być może niepoprawne) z góry pomyślane pojęcie tylko tworzenia klas dla konkretnych elementów aplikacji. Jednak myślę, że zamierzam stworzyć hybrydę, korzystając z rozwiązania, które podałeś powyżej .. tj. Pakietu narzędziowego z modułem plików/słownika. Podana powyżej grupa wydaje mi się dobra i, jak pan stwierdził, mogę rozwijać te moduły w miarę wykonywania bardziej ogólnych funkcji i mogę je przenosić. Poza tym najprawdopodobniej uczynię je niezależnymi od aplikacji. Dzięki za opinie. – user2152283

+2

Dlaczego "classes" i "static_methods"? Python nie jest Javą, kiedy wszystko czego potrzebujesz, to funkcja, a następnie za pomocą wszelkich funkcji użyj funkcji. –

+0

@ user2152283 Tak, najlepiej uniezależnić aplikacje od aplikacji, oszczędzając pracy dla każdego przyszłego projektu, w którym używasz stworzonej funkcjonalności. –

0

W pythonie mamy coś o nazwie Pakiet (zwykły folder z pustym plikiem o nazwie __init__.py), który służy do przechowywania wszystkich modułów w ten sposób, że tworzymy somesort odstępów między nazwami.

Twoja aplikacja może uzyskać dostęp do własnej przestrzeni nazw za pomocą.

na przykład posiadać następujące pliki

MyPackage/__init__.py (empty) 
MyPackage/webapp.py (your web application) 
MyPackage/utils.py (generic utilities) 

aw webapp.py można mieć coś takiego

from .utils import * 

lub wymienić je jeden po drugim

from .utils import file_read, file_write 

zwrócić uwagę na prefiks kropki przed utils

+4

import * jest ogólnie uważany za szkodliwą praktykę. – Kiro

+0

@Kiro, generalnie masz rację, ale w takim konkretnym przypadku jest OK, ponieważ utils.py jest tam, gdzie zamierza umieścić wspólną funkcję podobną do jego wersji php's file_get_contents. jeśli jesteś conserned możesz zdefiniować '' '__all__''' –

+0

Dziękuję za tę odpowiedź. To jest świetna odpowiedź i zamierzam użyć wariantu tego rozwiązania. – user2152283

0

Jest coś, co można zrobić, aby zmniejszyć liczbę plików modułów, zachowując podkategorie modułów. Utwórz wielopoziomowe funkcje modułu: myModule.Hash.<> myModule.FileIO. <>

W ten sposób można importować poszczególne komponenty zgodnie z własnymi upodobaniami.

+0

Dziękuję za opinię. Oceniłbym to również jako akceptowalną odpowiedź, zaznaczając powyższą odpowiedź jako zaakceptowaną, ponieważ była to pierwsza odpowiedź. Dziękuję Ci! – user2152283

Powiązane problemy