[EDIT 00]: Tôi đã chỉnh sửa nhiều lần bài đăng và bây giờ ngay cả tiêu đề, vui lòng đọc phần bên dưới.Triển khai nội suy chuỗi Python
Tôi chỉ biết về phương pháp chuỗi định dạng, và việc sử dụng nó với từ điển, giống như những người được cung cấp bởi vars()
, locals()
và globals()
, ví dụ:
name = 'Ismael'
print 'My name is {name}.'.format(**vars())
Nhưng tôi muốn làm:
name = 'Ismael'
print 'My name is {name}.' # Similar to ruby
Vì vậy, tôi đã đưa ra với điều này:
def mprint(string='', dictionary=globals()):
print string.format(**dictionary)
Bạn có thể tương tác với mã ở đây: http://labs.codecademy.com/BA0B/3#:workspace
Cuối cùng, những gì tôi rất thích làm là phải có các chức năng trong một tập tin, tên my_print.py
, vì vậy tôi có thể làm:
from my_print import mprint
name= 'Ismael'
mprint('Hello! My name is {name}.')
Nhưng vì nó là ngay bây giờ, có một vấn đề với phạm vi, làm thế nào tôi có thể nhận được không gian tên module chính như một từ điển từ bên trong chức năng in mprint. (không phải là từ số my_print.py
)
Tôi hy vọng tôi đã tự mình hiểu, nếu không, hãy thử nhập hàm từ mô-đun khác. (truy nguyên nằm trong liên kết)
Truy cập vào globals()
dict từ my_print.py
, nhưng tất nhiên tên biến không được xác định trong phạm vi đó, bất kỳ ý tưởng nào về cách thực hiện điều này?
Chức năng hoạt động nếu được xác định trong cùng một mô-đun, nhưng lưu ý cách tôi phải sử dụng globals()
vì nếu không tôi sẽ chỉ nhận từ điển có giá trị trong phạm vi mprint()
.
Tôi đã thử sử dụng ký hiệu không dấu và dấu chấm để truy cập các biến mô-đun chính, nhưng tôi vẫn không thể tìm ra.
[EDIT 01]: Tôi nghĩ rằng tôi đã tìm ra một giải pháp:
Trong my_print.py:
def mprint(string='',dictionary=None):
if dictionary is None:
import sys
caller = sys._getframe(1)
dictionary = caller.f_locals
print string.format(**dictionary)
Trong test.py:
from my_print import mprint
name = 'Ismael'
country = 'Mexico'
languages = ['English', 'Spanish']
mprint("Hello! My name is {name}, I'm from {country}\n"
"and I can speak {languages[1]} and {languages[0]}.")
Bản in:
Hello! My name is Ismael, I'm from Mexico
and I can speak Spanish and English.
Bạn nghĩ sao? Đó là một điều khó khăn đối với tôi!
Tôi thích nó, dễ đọc hơn nhiều đối với tôi.
[EDIT 02]: Tôi đã thực hiện một mô-đun với một chức năng interpolate
, một lớp Interpolate
và một nỗ lực cho một phương pháp interpolate
lớp tương tự như chức năng.
Nó có bộ thử nghiệm nhỏ và được ghi lại!
Tôi bị kẹt với việc triển khai phương pháp, tôi không hiểu.
Đây là mã: http://pastebin.com/N2WubRSB
Bạn nghĩ sao?
[EDIT 03]: Ok tôi đã giải quyết chỉ với interpolate()
chức năng cho bây giờ.
Trong string_interpolation.py
:
import sys
def get_scope(scope):
scope = scope.lower()
caller = sys._getframe(2)
options = ['l', 'local', 'g', 'global']
if scope not in options[:2]:
if scope in options[2:]:
return caller.f_globals
else:
raise ValueError('invalid mode: {0}'.format(scope))
return caller.f_locals
def interpolate(format_string=str(),sequence=None,scope='local',returns=False):
if type(sequence) is str:
scope = sequence
sequence = get_scope(scope)
else:
if not sequence:
sequence = get_scope(scope)
format = 'format_string.format(**sequence)'
if returns is False:
print eval(format)
elif returns is True:
return eval(format)
Cảm ơn một lần nữa chàng trai! Bạn có ý kiến gì không?
[EDIT 04]:
Đây là phiên bản cuối cùng của tôi, nó có một bài kiểm tra, docstrings và mô tả một số hạn chế tôi đã tìm thấy: http://pastebin.com/ssqbbs57
Bạn có thể nhanh chóng kiểm tra mã ở đây : http://labs.codecademy.com/BBMF#:workspace
Và bản sao Grom git repo ở đây: https://github.com/Ismael-VC/python_string_interpolation.git
liên quan: [? Là một định dạng chuỗi kéo biến từ kêu gọi thực hành xấu phạm vi của nó] (http://stackoverflow.com/questions/13312240/is- a-string-format-that-pull-variables-from-its-calling-scope-bad-practice) – jfs
liên quan: [In tên biến và nội dung dưới dạng công cụ gỡ lỗi; tìm kiếm emacs/Python shortcut] (http://stackoverflow.com/questions/2813227/printing-variable-names-and-contents-as-debugging-tool-looking-for-emacs-python) – jfs
Đây là một bài tập thú vị , nhưng tôi sẽ cảnh báo chống lại kiểu hành vi tiềm ẩn này: Python không khuyến khích nó ("Rõ ràng là tốt hơn là ngầm" nghĩa là ở đây 'mprint ('…', vars())' tốt hơn 'mprint ('…')' quay trở lại người gọi và nhận các biến cục bộ của nó), và tôi nghĩ rằng nó có lý do chính đáng (mã rõ ràng được cho là dễ đọc và duy trì hơn). – EOL