Jump to content

[python] losowe parametry funkcji


SeeM
 Share

Recommended Posts

Hej.

Potrzebuję losować sobie dużo użytkowników przy każdym testowaniu aplikacji. Mam coś takiego:

def random_string(length=15):
  return ''.join(random.choices(string.ascii_lowercase, k=length))

def create_test_user(username=random_string(),
                     email=f'{random_string()}@email.pl',
                     password='qwerty*%123456'):
  user_test = User(username=username, email=email, password=password)
  return user_test

Problem w tym, że to nie przelosowuje ani wartości username oraz email:

In [2]: ble = create_test_user

In [3]: ble2 = create_test_user

In [4]: ble
Out[4]: <function mekhub.tests.create_test_user(username='suvkqmwtxyxivho', email='[email protected]', password='qwerty*%123456')>

In [5]: ble2
Out[5]: <function mekhub.tests.create_test_user(username='suvkqmwtxyxivho', email='[email protected]', password='qwerty*%123456')>

Pewnie to coś łatwego, ale nie mogę sobie z tym poradzić. Próbowałem dodać random.seed() przed każdym wywołaniem fukcji random_string oraz create_test_user, ale za nadal wartości username oraz email są te same.

Fukcja random_string działa zgodnie z oczekiwaniami, zwracając różne 15-znakowe ciągi. Jedynie create_test_user zwraca ciągle te same wartości. Nawet po usunięciu i zdefiniowaniu ponownie funkcji create_test_user wartości są te same.

n [1]: from aplikacja.tests import random_string, create_test_user

In [2]: ble = create_test_user

In [3]: ble
Out[3]: <function mekhub.tests.create_test_user(username='rdemxbsltajpkja', email='[email protected]', password='qwerty*%123456')>

In [4]: del create_test_user

In [5]: from aplikacja.tests import random_string, create_test_user

In [6]: ble2 = create_test_user

In [7]: ble2
Out[7]: <function mekhub.tests.create_test_user(username='rdemxbsltajpkja', email='[email protected]', password='qwerty*%123456')>

Macie jakieś pomysły?

 

Link to comment
Share on other sites

Problem banalny, przypisujesz funkcję do zmiennej. Zamiast ble = create_test_user korzystaj z ble = create_test_user(). Z twoim obecnym sposobem aby cokolwiek uzyskać musiałbyś wywołać samą funkcję z poziomu zmiennej tj ble()

  • Upvote 2
Link to comment
Share on other sites

To już próbowałem i byłoby zbyt proste (-:

In [2]: ble = create_test_user()

In [3]: ble2 = create_test_user()

In [4]: ble
Out[4]: <User: ealksmyezmnrgpt>

In [5]: ble2
Out[5]: <User: ealksmyezmnrgpt>

Zawsze dostaję tę samą nazwę użytkownika.

Link to comment
Share on other sites

19 minut temu, sunrise napisał:

Oprócz tego co tomcio napisał w Pythonie wartość domyślna parametru funkcji jest ustawiana raz przy jej definiowaniu, a nie przy wywoływaniu.

O, to już trochę wyjaśnia. Dzięki, będę musiał podejść do problemu inaczej.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...