بيثون / سكابي راندماك () العدد
سؤال
لدي مشكلة مزعجة حقا حاولت حلها لبضعة أيام.لا يمكنني العثور على أي معلومات على الشبكة.
حاولت حلها بنفسي ، تشاورت مع الوثائق.لكن لا شيء يعمل.
مشكلتي هي
عندما أقوم بتعيين متغير X
مع RandMAC()
وظيفة, X
يجب أن تكون هي نفسها في كل مرة أستخدمها.
مثل, X = RandMAC()
, ، ودعونا نقول X
هو الآن AA:BB:CC:DD:EE:FF
وعندما أطبع س لمدة 3 مرات ، يجب أن يكون شيئا من هذا القبيل.
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
ولكن ما يفعله الرمز في الواقع هو
X = AA:BB:CC:DD:EE:FF
X = 00:0A:0B:0C:0D:0E:0F
X = 11:22:33:44:55:66
لذلك تغيرت في كل مرة أدعو طباعة العاشر.
كيف يمكنني حل هذه المشكلة ?
رمز بلدي هو على النحو التالي.
from scapy.all import *
X = RandMAC()
print X
print X
print X
شكرا لكم جميعا مقدما.
المحلول
RandMAC
هو فئة ، وعند استدعاء RandMAC()
ما تحصل عليه هو مثال على تلك الفئة. scapy
لديها الكثير من هذه RandXXXXX
الطبقات ، وأنهم جميعا يتصرفون بنفس الطريقة:مثيل الطبقة هو في الحقيقة نوع من عشوائي شيء مولد ، وليس ثابت (ولكن تم اختيارها عشوائيا) شيء.في هذه الحالة ، أ RandMac
بنيت من ستة RandByte
س ، و أ RandByte
يتحول إلى قيمة عشوائية من 0 إلى 255 في كل مرة يطلب فيها قيمتها.
والفكرة ، على ما أعتقد ، هي أن تجعل من السهل بناء (على سبيل المثال) موزع عشوائي لحزمة إب يمنحك حزم إب التي هي كل نفس إلا أنه يتم اختيار اثنين من الحقول عشوائيا لكل حزمة.
لذلك ، على أي حال ، يتم تفويض العديد من العمليات على كائنات الأشياء العشوائية بشكل فعال لنتائج "إصلاحها" (أي اختيار قيمة عشوائية معينة);انظر volatile.py
في شفرة المصدر ، فئة VolatileValue
;السحر يحدث في __getattr__
الطريقة.على وجه الخصوص ، ينطبق هذا على التوتير عبر __str__
, ، وهو ما str()
هل كما لوحظ من قبل ليشا وماذا print
هل كما لاحظ كارون س.
إذا كنت ترغب في الحصول على قيمة عشوائية واحدة ، وأقرب شيء إلى الطريق الصحيح هو على الارجح لاستدعاء _fix
الطريقة: X = RandMAC()._fix()
.أن يحدث أن تكون هي نفسها str
ل RandMAC
, ، ولكن على سبيل المثال.إذا كان لديك عدد صحيح عشوائي ثم _fix
سوف تعطيك عدد صحيح الفعلي في حين str
سوف تعطيك تمثيل سلسلة لها.
لا يبدو أن أيا من هذا موثق.لا تجعل أي رهانات كبيرة على أنها لا تزال تعمل في الإصدارات المستقبلية.(ولكن ، لما يستحق, volatile.py
لم يتغير منذ حوالي عامين.)
نصائح أخرى
أنا لا أعرف إذا RandMac
لديه طريقة للقيام بهذه الطريقة الأخرى ، ولكن يمكنك تحويل X
في سلسلة ، بهذه الطريقة ستبقى كما هي.في التعليمات البرمجية الخاصة بك X
في الواقع يدعو وظيفة في كل مرة.
X = str(RandMAC())
print X
print X
print X