Хотя я обычно соглашаюсь с тем, что 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
>>>
Посмотрите эти ответ расценивать openhandle()
от Scalar::Util
. Ответ, который я первоначально записал здесь, был однажды лучшее, которое мы могли сделать, но это теперь плохо устарело.
Почему Вы хотели бы сделать это? Единственная причина, о которой я могу думать, состоит в том при использовании старых дескрипторов файлов пакета стиля (который Вы, кажется, делаете), и хотят предотвратить случайно сохранение одного дескриптора по другому.
, Что вопрос может быть решен при помощи нового стиля косвенные дескрипторы файлов.
open my $fh, '<', $filename or die "Couldn't open $filename: $!";
Perl обеспечивает функция fileno для точно этой цели.
РЕДАКТИРОВАНИЕ я признаю ошибку на цели fileno()
. Я действительно предпочитаю более короткий тест
fileno FILEHANDLE
более чем
tell FH != -1
Tell выдает предупреждение (как и stat, -s, -e и т. Д.) С use warnings
(-w)
perl -wle '
open my $fh, "<", "notexists.txt";
print "can stat fh" if tell $fh
'
tell() on closed filehandle $fh at -e line 1.
-1
Альтернативы fileno ($ fh)
и eof ($ fh)
не вызывают предупреждений.
Я обнаружил, что лучшей альтернативой было сохранить вывод из open
.