Как передать переменную в качестве аргумента в магическую команду% run [duplicate]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
58
задан Student 3 October 2015 в 17:17
поделиться

3 ответа

IPython расширяет переменные с помощью $name, bash-style. Это верно для всех магов , а не только %run.

Итак, вы бы сделали:

In [1]: filename = "myscript.py"

In [2]: %run $filename
['myscript.py']

myscript.py содержит:

import sys
print(sys.argv)

Благодаря форматированию строчной строки Python вы можете даже выражать выражения внутри {}:

In [3]: args = ["arg1", "arg2"]

In [4]: %run $filename {args[0]} {args[1][-2:]}
['myscript.py', 'arg1', 'g2']
85
ответ дан minrk 17 August 2018 в 15:48
поделиться
  • 1
    Просто хотелось бы упомянуть, что это также очень хорошо работает при запуске произвольных команд оболочки с использованием восклицательного знака (!) - см. Официальные документы - ipython.org/ipython-doc/rel-0.10.2/html/interactive/ & hellip; – yoniLavi 3 October 2013 в 09:34
  • 2
    @minrk Просто вопрос, в чем разница между переменной и выражением. Является ли переменная словаря выражением? Я прошу, потому что после вашего примера мне пришлось использовать форматирование фальшивых строк для расширения словаря, но не удалось, когда вместо этого я использовал $. Я думал, что списки, словари и т. Д. - все переменные типы. – Stephen Jacob 29 June 2018 в 07:17

Используйте get_ipython(), чтобы получить ссылку на текущий InteractiveShell , затем вызовите метод magic():

In [1]: ipy = get_ipython()

In [2]: ipy.magic("run foo.py")
ERROR: File `u'foo.py'` not found.

Редактировать См. ответ minrk - это гораздо лучший способ сделать это.

9
ответ дан Community 17 August 2018 в 15:48
поделиться
  • 1
    Хотя это не лучший способ сделать это, он ответил на другой мой вопрос: каким образом выполнять команды магии ipython в консоли python (как при использовании spyder) – stuppie 19 February 2015 в 04:26

Кажется, это невозможно при использовании встроенной функции %run. Тем не менее, ваш вопрос привел меня к кроличьей норе, и я хотел посмотреть, как легко было бы сделать что-то подобное. В конце концов, кажется бессмысленным пойти на все эти усилия, чтобы создать еще одну магическую функцию, которая просто использует execfile(). Возможно, это кому-то будет полезно.

# custom_magics.py
from IPython.core.magic import register_line_magic, magics_class, line_magic, Magics

@magics_class
class StatefulMagics(Magics):
    def __init__(self, shell, data):
        super(StatefulMagics, self).__init__(shell)
        self.namespace = data

    @line_magic
    def my_run(self, line):
        if line[0] != "%":
            return "Not a variable in namespace"
        else:
            filename = self.namespace[line[1:]].split('.')[0]
            filename += ".py"
            execfile(filename)
        return line

class Macro(object):
    def __init__(self, name, value):
        self.name = name
        self._value = value
        ip = get_ipython()
        magics = StatefulMagics(ip, {name: value})
        ip.register_magics(magics)

    def value(self):
        return self._value

    def __repr__(self):
        return self.name

Используя эту пару классов (и учитывая скрипт python tester.py), можно создать и использовать переменную «macro» с недавно созданная магическая функция «my_run»:

In [1]: from custom_magics import Macro

In [2]: Macro("somename", "tester.py")
Out[2]: somename

In [3]: %my_run %somename
I'm the test file and I'm running!
Out[3]: u'%somename'

Да, это огромный и, вероятно, расточительный взлом. В этом ключе, интересно, есть ли способ привязать имя, связанное с объектом Macro, как фактическое имя макроса. Посмотрите на это.

1
ответ дан Emmett J. Butler 17 August 2018 в 15:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: