سؤال

لدي عدد قليل من نصوص IPython التي لها وظائف زائدة عن الحاجة.أرغب في إعادة هيكلة الوظيفة المشتركة في وحدة نمطية واحدة وتضمين تلك الوحدات في البرنامج النصي الحالي.تكمن المشكلة في أنه لا يمكن إنشاء وحدة نمطية بيثون لأن الكود يستخدم امتدادات لغة Ipython (!، $ إلخ).هل من الممكن إنشاء وحدة تحتوي على كود IPython وإدراجها في نصوص IPython أخرى؟

هل كانت مفيدة؟

المحلول

يجب ألا تقوم بحفظ عناصر ملحق IPython (?, !, %run) في الملفات.أبدًا.هذه أدوات تفاعلية وهي عبارة عن شيء تكتبه بيديك ولكن لا تحفظه أبدًا في ملف.

  1. ابحث عن الميزات المشتركة بين ملفاتك.لديك بالضبط أربعة أنواع من الأشياء المرشحة لهذا الغرض.

    • الواردات (import)

    • تعريفات الدالة (def)

    • تعريفات الفئة (class)

    • تعيينات المتغير العالمي

    يجب عليك إزالة جميع ميزات IPython التفاعلية من هذا الرمز.كله.

  2. أعد كتابة نصوصك البرمجية بحيث (1) تستورد عناصرك الشائعة، (2) وتقوم بالعمل المفيد الذي من المفترض أن تقوم به.

    يجب عليك إزالة جميع ميزات IPython التفاعلية من هذا الرمز.كله.

    يمكنك الآن تشغيل البرامج النصية الخاصة بك وهم يقومون بعملهم كما يُفترض أن تكون نصوص Python مناسبة.

لا يزال بإمكانك استخدام ميزات امتداد IPython مثل !, ? و %run عندما تكتب، ولكن لا ينبغي عليك حفظها في ملفات.

نصائح أخرى

وتقنيا إذا قمت بحفظ النصي مع تمديد .ipy، ipython سوف نرى ذلك واستخدام كل ما هو الاشياء يتوهم بدلا من تمرير مباشرة إلى مترجم الثعبان. ومع ذلك، أود أن أوصى عموما ضد هذا، ويذهب مسار S.Lott أعلاه.

وهناك الكثير من الناس يعتقدون بقوة كنت لا يفترض أن يكون البرامج النصية مع تركيب IPython في نفوسهم، ولكن إذا كنت غريبة بما فيه الكفاية (وأنا) ويبحثون عن بعض طرق ممتعة لمزيج بيثون وقذيفة البرامج النصية، يجب عليك الخروج من بلدي برنامج المجمع على جيثب

استخدم مثال الحالة:

$ cat > example.ipy

rehashx

a = !ls -l | tail -n 3
print a.fields(0)

b = 'foo'
echo bar ${b}

$ ipyscript.py example.ipy

['-rw-r--r--', 'drwxr-xr-x', 'drwxrwxr-x']
bar foo

وكما اتضح، جوهر IPython كما يدعم صيغة (وظيفية بالكاد) من السيناريو أعلاه:

In [2]: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy?
Type:       instancemethod
Base Class: <type 'instancemethod'>
String Form:<unbound method InteractiveShell.safe_execfile_ipy>
Namespace:  Interactive
File:       /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py
Definition: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy(self, fname)
Docstring:
Like safe_execfile, but for .ipy files with IPython syntax.

Parameters
----------
fname : str
    The name of the file to execute.  The filename must have a
    .ipy extension.

إذا قمت بإدخال أوامر إلى النسخة التفاعلية من IPython ثم استخدام الأمر اصمت (مع -n لإزالة أرقام الأسطر)، IPython يبصق كافة الأوامر التي قمت بتشغيل، مع رمز الثعبان الفعلية المستخدمة في مكان ! قرص! يرة سورية، وما إلى ذلك وفيما يلي مثال على ذلك.

_ip.system("ls")
_ip.system("ls -F ")
_ip.magic("cd ")

http://ipython.scipy.org/moin/IpythonExtensionApi يفسر هذا الكائن. هذا هو أساسا ما عليك القيام به (مقتبسة من الوصلة):

import IPython.ipapi
_ip = IPython.ipapi.get()

والآن كل من الكود الذي تم لصقه من قيادة اصمت وIPython قذيفة يجب أن تعمل بشكل جيد.

هل كان لديك نظرة على وحدة IPython (pydoc IPython)؟ ربما يمكنك الوصول إلى المرافق IPython من خلال كود بايثون النقي.

ويمكنك أن تفعل ذلك.

وهنا مثال على ذلك.

وهذا هو محتوى ملف a.ipy:

%run b.ipy

print(myvar)
print(myfunc())

وهذا هو محتوى ملف b.ipy:

myvar = !echo 1

def myfunc():
  tmp_var = !echo 2
  return tmp_var

وكما ترون الاستخدامات b.ipy! المشغل أو العامل. عند تنفيذ a.ipy تحصل على النتيجة التالية:

ipython a.ipy 
['1']
['2']

وهكذا، كنت "استيراد" "وحدات" لا أحب أن تفعل ذلك في بيثون، ولكن مثل كنت تفعل ذلك في قذيفة مع source.

ولكن لست متأكدا ما اذا كان الطريق الصحيح، قد يكون هو. على الأقل كان يعمل ويسمح لك لاستخراج وظائف المشتركة وإعادة استخدامها من ملفات البرامج النصية الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top