• בלוג
  • הפיצ'ר הכי חשוב שפייתון שכחו לגנוב ל perl

הפיצ'ר הכי חשוב שפייתון שכחו לגנוב ל perl

29/06/2018

אוביקט מידע הוא אוביקט מאוד פשוט שכל מה שיש בו זה מספר מאפיינים ומתודות גישה למאפיינים אלה. קחו לדוגמא אוביקט משתמש שמכיל שדות עבור שם וסיסמא.

הספריה Moose של פרל מציעה תחביר מאוד נוח לכתיבת Data Objects:

use v5.18;
package User {
  use Moose;
  has 'name', is => 'rw', isa => 'Str', required => 1;
  has 'password', is => 'rw', isa => 'Str', required => 1;
}

my $u = User->new(name => 'ynonp', password => '1234');
say $u->name;

עם גירסת פייתון 3.7 שיצאה אתמול כל זה השתנה. בזכות השימוש ב data object החדש של 3.7 התוכנית הבאה עובדת ולא דורשת להגדיר פונקציית איתחול:

from dataclasses import dataclass

@dataclass
class User:
    name: str
    password: str

u = User(name='ynon', password='1234')

print(u.name)

בניגוד ל namedtuple אפשר לעדכן את השדות וגם להוסיף ערכי ברירת מחדל, להוסיף מתודות על האוביקט, להשתמש בירושה ולכן אנחנו בעצם מקבלים אוביקט פייתון ממש בלי שנצטרך להתאמץ כדי להגדיר את פונקציית init. אבל כמו בהרבה מקרים כאלה דווקא הפיצ'ר שאני הכי אוהב בפרל חסר פה, וזהו ה lazy build. שימו לב לקוד הבא בפרל:

use v5.18;
use HTTP::Tiny;
package User {
  use Moose;
  has 'name', is => 'rw', isa => 'Str', required => 1;
  has 'password', is => 'rw', isa => 'Str', lazy_build => 1;

  sub _build_password {
    my $response = HTTP::Tiny->new->get('https://makemeapassword.org/api/v1/passphrase/plain?pc=1');
    $response->{content};
  }
}

my $u = User->new(name => 'ynonp', password => '1234');
say $u->name;
say $u->password;

my $t = User->new(name => 'ynonp');
say $t->name;
say $t->password;
say $t->password;

ביצירה הראשונה ה Data Object מאותחל עם שם וסיסמא ולכן אפשר להדפיס את שני הערכים. בפעם השניה שלחנו ערך רק עבור name ולכן הסיסמא תיווצר אוטומטית ובאופן עצל. רק בפעם הראשונה שניגש לקרוא את הסיסמא פרל יפנה לאינטרנט ויצור סיסמא חדשה דרך אתר makemeapassword.org. לאחר מכן התוצאה נשמרת באוביקט וכל גישה נוספת לשדה הסיסמא מחזירה את הסיסמא השמורה.

בינתיים מנגנון זה לא קיים ב Data Objects של פייתון. אולי לקראת גירסא 3.8. ועדיין, Data Objects הם תוספת מבורכת לשפה.