Wpis z mikrobloga

Mam pytanie odnośnie zasad pisania kodu.

Funkcję user-input() chcemy wywołać tylko raz, i chcemy zwrócić z niej zmienną name, którą musimy użyć w funkcjach n1() i n2(). Jak to najlepiej zrobić?

Wiem, że można dopisać name = user-input(), ale czy należy tak robić? Bo jak kod będzie dłuższy, dołożymy jakieś importy/eksporty to name będzie zmienną globalną, a tego chyba należy unikać?

def user_input():
....name = input('Give me your name ')
........return name


def n1():
....print(F'Hey, {name}')

def n2():
....print(F'Hello {name}')

name = user_input() ???

n1()
n2()

#naukaprogramowania #python
  • 8
  • Odpowiedz
@Rajtuz: to zależy od skali projektu. W jednoplikowym skrypcie nazwa name może być wystarczająca, ale jeżeli planujesz importować to daj lepszą nazwę typu userfullname albo coś takiego. Idąc dalej niech n1 i n2 przyjmują argumenty które później wydrukują. W większych projektach pewnie najsensowniej byłoby użyć obiektu User z metodami get name i n1/n2 wtedy name będziesz miał pod atrybutem przy selfie - self.name. Ze swojego doświadczenia globalnych zmiennych używam tylko
  • Odpowiedz
@Rajtuz: Jesli zalezy ci na tym, aby odizolowac od siebie m.in. zmienne to mozesz stworzyc klase i metode, ktora pobierze te wartosc raz, przypisujac ja do selfa.

Innym rozwiazaniem, jest po prostu stworzeniu jakiejs glownej funkcji (np. main), ktora bedzie twoja lokalna przestrzenia nazw dla calego programu.
  • Odpowiedz
@RapRose: @zgubiles_sie_jelonku: Tylko gdzie stworzyć obiekt w takim przypadku? Napisałem coś takiego, ale chyba nie o to wam chodziło, bo to to samo co na początku tylko dłużej:

class UserFirstName:
....def get_username(self):
........self.name = input('Give me your name ')

user_fn = UserFirstName()
user_fn.get_username()


def n3():
....print(F'Hey, {user_fn.name}')

def n4():
....print(F'Hello, {user_fn.name}')

n3()
n4()
  • Odpowiedz
@Rajtuz:

class User:
def __init__(self):
self._name = None

def set_name(self):
self._name = input("Name: ")

def get_name(self):
print(f"Hello, {self._name}")

def main():
u = User()
u.set_name()
u.get_name()

main()

To możesz zrobić na wiele różnych sposobów oczywiście. Tutaj w globalnej przestrzeni tworzysz sobie klasę i funkcję main(), w której tworzysz sobie obiekty tej klasy. Nawet programując obiektowo gdzieś musisz tworzyć te obiekty, więc to nigdy nie będzie tak, że będziesz mieć zupełnie pustą przestrzeń
  • Odpowiedz
@zgubiles_sie_jelonku: No niestety, przy wykopowym formatowaniu przez nie może być pustych enterów, więc trzeba tego użyć wielokrotnie.

Dzięki, ciekawa koncepcja. Tylko, czy w takim przypadku wszystkie definicje korzystające z namenie muszą być w klasie UserFirstName? A co jakby namemusiało być użyte w jakiejś zewnętrznej funkcji?
  • Odpowiedz
@Rajtuz: nie pisz funkcji, które mąka dostęp do globalnych zmiennych, podawaj im argumenty zamiast n3(): print(user.name) zrób n3(user): print(user.name) wtedy ta funkcja będzie ogólna, bo po staremu to w zasadzie wgl nie potrzebujesz tej funkcji, bo po co
  • Odpowiedz
@Rajtuz:

Przykład dostosowałem trochę do twoich potrzeb, nie wiem na jakim poziomie jesteś i co chcesz z tym kodem zrobić.

Dzięki, ciekawa koncepcja. Tylko, czy w takim przypadku wszystkie definicje korzystające z namenie muszą być w klasie UserFirstName?


Dostęp do wartości name uzyskujesz poprzez metodę get_name. Mógłbyś nawet odwołać się do tego pola bezpośrednio (obiekt.pole), ale dostęp i modyfikacja wartości pól danego obiektu z zewnątrz też nie jest dobrym rozwiązaniem (chociaż
  • Odpowiedz
W takim wypadku lepiej byłoby nie printować tego imienia tylko po prostu je zwrócić.


@zgubiles_sie_jelonku: Hmm, tylko jak zwrócić atrybut name z obiektu klasy User np. do funkcji test1() i test2()?

class User:
....def __init__(self):
........self.name = None

....def set_name(self):
........self.name = input("Name: ")

....def get_name(self):
........return self.name

def main():
....u = User()
....u.set_name()
....u.get_name()

main()
def test1():
....print(F'Hello {name}')

def test2():
....print(F'Hey {name}')

test1()
test2()

---------------------------------------------------------------------------------------------------------------------
Zresztą czy nie wystarczyłoby
  • Odpowiedz