Как напечатать тело импортированного метода или функции в python? [Дубликат]

$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
274
задан Vertexwahn 4 March 2016 в 18:27
поделиться

11 ответов

Если вы строго определяете функцию самостоятельно, и это относительно короткое определение, решение без зависимостей должно определять функцию в строке и присваивать eval () выражения вашей функции.

Например.

funcstring = 'lambda x: x> 5'
func = eval(funcstring)

, а затем необязательно присоединить исходный код к функции:

func.source = funcstring
3
ответ дан cherplunk 21 August 2018 в 08:04
поделиться
  • 1
    Использование eval () кажется мне действительно, ДЕЙСТВИТЕЛЬНО плохим, если вы не пишете какой-то интерактивный интерпретатор Python. Eval открывает серьезные проблемы с безопасностью. Если вы примете политику только для определения строковых литералов, вы по-прежнему теряете много полезного поведения, начиная от выделения синтаксиса и заканчивая правильным отражением классов, в которых содержатся члены eval'ed. – Mark E. Haase 23 May 2012 в 15:38
  • 2
    Upvoting. @mehaase: безопасность здесь явно не проблема. Ваши другие комментарии, хотя и весьма актуальны, хотя я бы сказал, что отсутствие подсветки синтаксиса - это сочетание недостатка IDE и того факта, что python не является гомоиконным языком. – ninjagecko 16 August 2012 в 23:59
  • 3
    @ninjagecko Безопасность всегда является проблемой, когда вы даете советы широкой публике. Большинство читателей приезжают сюда, потому что это вопросы, связанные с поиском. Я не думаю, что многие люди собираются скопировать этот ответ дословно; вместо этого они собираются взять концепцию, которую они узнали, и применить ее к своей собственной проблеме. – Mark E. Haase 17 August 2012 в 20:57

Модуль проверки имеет методы для извлечения исходного кода из объектов python. По-видимому, он работает только в том случае, если источник находится в файле. Если у вас есть это, я думаю, вам не нужно будет получать источник от объекта.

172
ответ дан Cœur 21 August 2018 в 08:04
поделиться
  • 1
    Да, это работает только для объектов, определенных в файле. Не для тех, которые определены в интерпретаторе. – sastanin 9 January 2009 в 10:49
  • 2
    к моему удивлению, он работает в ноутбуках Ipython / Jupyter также – Dr. Goulu 22 January 2016 в 12:51
  • 3
    Я попытался использовать проверку в интерпретаторе python 3.5.3. import inspect + inspect.getsource(foo) работал нормально. – André C. Andersen 7 May 2017 в 18:52
  • 4
    @ AndréChristofferAndersen Да, но он не должен работать для функций, определенных в интерпретаторе – somebody 8 August 2017 в 01:08

для подведения итогов:

import inspect
print( "".join(inspect.getsourcelines(foo)[0]))
2
ответ дан douardo 21 August 2018 в 08:04
поделиться

Хотя я обычно соглашаюсь с тем, что inspect является хорошим ответом, я бы не согласился с тем, что вы не можете получить исходный код объектов, определенных в интерпретаторе. Если вы используете dill.source.getsource из dill , вы можете получить источник функций и лямбда, даже если они определены в интерактивном режиме. Он также может получить код для связанных или не связанных классов методов и функций, определенных в карри ... однако вы не сможете скомпилировать этот код без кода объекта-объекта.

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 
47
ответ дан Mike McKerns 21 August 2018 в 08:04
поделиться
  • 1
    похоже, не работает с функциями, определенными внутри exec – Ant6n 4 March 2014 в 02:55
  • 2
    @ Ant6n: Ну, это просто подлая. dill.source.getsource проверяет историю интерпретатора для функций, классов, lambdas и т. д. - он не проверяет содержимое строк, переданных exec. – Mike McKerns 4 March 2014 в 05:04
  • 3
    Это кажется очень интересным. Можно ли использовать dill для ответа на этот вопрос: stackoverflow.com/questions/13827543/… – ArtOfWarfare 20 February 2015 в 17:34
  • 4
    @ArtOfWarfare: частично, да. dill.source имеет функции, такие как getname и importable и getsource, которые фокусируются на получении исходного кода (или импортируемого, который дает объект) для любого заданного объекта. Для простых вещей, таких как int, существует источник no , поэтому он не работает должным образом (т. Е. Для «a = 10» он возвращает «10»). – Mike McKerns 20 February 2015 в 19:08
  • 5
    Однако это работает для глобальных переменных: >>> a = 10; print( [key for key, val in globals().items() if val is a][0] ) – Mike McKerns 20 February 2015 в 19:08

Если вы используете IPython, вам нужно ввести «foo ??»

In [19]: foo??
Signature: foo(arg1, arg2)
Source:
def foo(arg1,arg2):
    #do something with args
    a = arg1 + arg2
    return a

File:      ~/Desktop/<ipython-input-18-3174e3126506>
Type:      function
47
ответ дан prashanth 21 August 2018 в 08:04
поделиться
  • 1
    Очень полезно в IPython и Jupyter ноутбуке, если вы случайно удалили более одной ячейки, которая содержит функции, которые вы только что потратили на создание и тестирование дня. – AGS 28 June 2016 в 13:22

dis является вашим другом, если исходный код недоступен:

>>> import dis
>>> def foo(arg1,arg2):
...     #do something with args
...     a = arg1 + arg2
...     return a
...
>>> dis.dis(foo)
  3           0 LOAD_FAST                0 (arg1)
              3 LOAD_FAST                1 (arg2)
              6 BINARY_ADD
              7 STORE_FAST               2 (a)

  4          10 LOAD_FAST                2 (a)
             13 RETURN_VALUE
70
ответ дан schlamar 21 August 2018 в 08:04
поделиться
  • 1
    Выбрасывает TypeError для встроенных. – Noumenon 25 August 2015 в 16:47
  • 2
    @Noumenon, потому что у них обычно нет исходного кода на Python, они написаны на C – schlamar 26 August 2015 в 11:57
  • 3
    удачи, отображающие эту информацию как QToolTip ();) – Tcll 31 August 2015 в 03:57

Если функция из исходного файла, доступного в файловой системе, может помочь inspect.getsource(foo) :

Если foo определяется как:

def foo(arg1,arg2):         
    #do something with args 
    a = arg1 + arg2         
    return a  

Затем:

import inspect
lines = inspect.getsource(foo)
print(lines)

Возвраты:

def foo(arg1,arg2):         
    #do something with args 
    a = arg1 + arg2         
    return a                

Но я считаю, что если функция скомпилирована из строки, потока или импортирована из скомпилированного файл, то вы не можете получить его исходный код.

375
ответ дан SmartManoj 21 August 2018 в 08:04
поделиться
  • 1
    Возвращает кортеж; tuple [0] - список строк, представляющих строки исходного кода, а tuple [1] - номер строки в контексте выполнения, где он был запущен. В IPython; это номер строки внутри cell не общий ноутбук – The Red Pea 23 September 2014 в 06:32
  • 2
    Этот ответ явно не упоминает об этом, но inspect.getsource (foo) возвращает источник в одной строке вместо кортежа, где tuple [0] - это список строк. getource будет более полезным, если вам нужно заглянуть в repl – whaley 23 August 2015 в 13:49
  • 3
    он не работает, например, функция len. Где я могу найти исходный код для функции len? – oaklander114 15 September 2016 в 06:06
  • 4
    Кажется, не работает в режиме ожидания. – ctrl-alt-delor 21 November 2017 в 13:59
  • 5
    – SÅ‚awomir Lenart 17 October 2018 в 10:59

Вы можете использовать модуль inspect, чтобы получить полный исходный код для этого. Вы должны использовать метод getsource() для этого из модуля inspect. Например:

import inspect

def get_my_code():
    x = "abcd"
    return x

print(inspect.getsource(get_my_code))

Вы можете проверить дополнительные параметры в приведенной ниже ссылке. получить ваш код python

10
ответ дан Szabolcs 21 August 2018 в 08:04
поделиться

Чтобы развернуть ответ runeh:

>>> def foo(a):
...    x = 2
...    return x + a

>>> import inspect

>>> inspect.getsource(foo)
u'def foo(a):\n    x = 2\n    return x + a\n'

print inspect.getsource(foo)
def foo(a):
   x = 2
   return x + a

EDIT: Как указано в @ 0sh, этот пример работает с использованием ipython, но не является простым python. В обоих случаях должно быть хорошо, при импорте кода из исходных файлов.

20
ответ дан TomDotTom 21 August 2018 в 08:04
поделиться
  • 1
    Это не сработает, поскольку интерпретатор будет компилировать foo в байт-код и выкидывать исходный код, поднимая OSError, если вы попытаетесь запустить getsource(foo). – 0sh 7 February 2015 в 19:14
  • 2
    @ 0sh хорошая точка в отношении интерпретатора ванильного python. Однако приведенный выше пример кода работает при использовании IPython. – TomDotTom 26 June 2015 в 09:04

I считают , что имена переменных не хранятся в файлах pyc / pyd / pyo, поэтому вы не можете получить точные строки кода, если у вас нет исходных файлов.

-2
ответ дан Abgan 21 August 2018 в 08:04
поделиться
0
ответ дан marko.ristin 1 November 2018 в 02:54
поделиться
Другие вопросы по тегам:

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