Python equivt of __FILE__ and __LINE__
Jeff Schwab
jeff at schwabcenter.com
Tue Feb 12 11:41:20 EST 2008
alain wrote:
> On Feb 11, 10:58 am, "Bill Davy" <B... at SynectixLtd.com> wrote:
>> Writing a quick and dirty assembler and want to give the user the location
>> of an error. The "assembly language" is Python. If the user wants to
>> generat some object code they write something like:
>>
>> Label(LoopLable)
>> Load(R4)
>> Dec()
>> JNZ(LoopLabel)
>>
>> I can use Python to do all the expression evalutaion, conversion from Python
>> FP to target FP, include files, macros (done as function definitions). The
>> functions like Load() generate the approproyte object code.
>>
>> So, for example, when a label is defined or referenced, I save the File,Line
>> so if there is not exactly one defintion or no references, I can report the
>> file location(s) to be considered. In the example, I would want to report
>> that LoopLable is not referenced, and LoopLabel is not defined.
>>
>> TIA,
>> Bill
>>
>> PSwww.SynectixLtd.comis not relevant
>
> def __LINE__():
> try:
> raise Exception
> except:
> return sys.exc_info()[2].tb_frame.f_back.f_lineno
> def __FILE__():
> return inspect.currentframe().f_code.co_filename
That's awesome. It's easy to see how these and other
'preprocessor-like' constructs could be wrapped into a convenient
module. But the leading and trailing double-underscores, and the
all-caps function names, seem very un-python. (It's not really going to
look like C, anyway, since the client code will need parentheses after
the pseudo-macro names.) What would be more pythonic? Maybe something
like this?
# srcinfo.py
import inspect
import sys
def line():
try:
raise Exception
except:
return sys.exc_info()[2].tb_frame.f_back.f_lineno
def file():
return inspect.currentframe().f_code.co_filename
if __name__ == '__main__':
print "%s: %d" % (file(), line())
# client.py
import srcinfo
if __name__ == '__main__':
try:
# Whatever.
raise Exception, "hello"
except Exception, x:
print ('warning: %s: %d: %s' %
(srcinfo.file(), srcinfo.line(), x))
More information about the Python-list
mailing list