Implementieren der Python-Slice-Notation

Ich versuche, Python neu zu implementierenSchnittnotation in einer anderen Sprache (PHP) und auf der Suche nach einem Snippet (in einer beliebigen Sprache oder einem Pseudocode), das die Python-Logik nachahmt. Das heißt, eine Liste und ein Triple gegeben(start, stop, step) oder ein Teil davon, ermitteln Sie die korrekten Werte oder Standardwerte für alle Parameter und geben Sie einen Slice als neue Liste zurück.

Ich habe versucht, hinein zu schauendie Quelle. Dieser Code geht weit über meine C-Kenntnisse hinaus, aber ich kann nicht anders, als dem Kommentar zuzustimmen, der besagt:

/* this is harder to get right than you might think */ 

Auch wenn so etwas bereits geschehen ist, werden Hinweise sehr geschätzt.

Dies ist mein Prüfstand (stellen Sie sicher, dass Ihr Code erfolgreich ist, bevor Sie ihn veröffentlichen):

#place your code below
code = """
def mySlice(L, start=None, stop=None, step=None):
or 
<?php function mySlice($L, $start=NULL, $stop=NULL, $step=NULL) ...
or 
function mySlice(L, start, stop, step) ...
"""

import itertools

L = [0,1,2,3,4,5,6,7,8,9]

if code.strip().startswith('<?php'):
     mode = 'php'

if code.strip().startswith('def'):
     mode = 'python'

if code.strip().startswith('function'):
     mode = 'js'

if mode == 'php':
    var, none = '$L', 'NULL'
    print code, '\n'
    print '$L=array(%s);' % ','.join(str(x) for x in L)
    print "function _c($s,$a,$e){if($a!==$e)echo $s,' should be [',implode(',',$e),'] got [',implode(',',$a),']',PHP_EOL;}"

if mode == 'python':
    var, none = 'L', 'None'
    print code, '\n'
    print 'L=%r' % L
    print "def _c(s,a,e):\n\tif a!=e:\n\t\tprint s,'should be',e,'got',a"

if mode == 'js':
    var, none = 'L', 'undefined'
    print code, '\n'
    print 'L=%r' % L
    print "function _c(s,a,e){if(a.join()!==e.join())console.log(s+' should be ['+e.join()+'] got ['+a.join()+']');}"


print

n = len(L) + 3
start = range(-n, n) + [None, 100, -100]
stop  = range(-n, n) + [None, 100, -100]
step  = range(-n, n) + [100, -100]

for q in itertools.product(start, stop, step): 

    if not q[2]: q = q[:-1]

    actual = 'mySlice(%s,%s)' % (var, ','.join(none if x is None else str(x) for x in q))
    slice_ = 'L[%s]' % ':'.join('' if x is None else str(x) for x in q)
    expect = eval(slice_)

    if mode == 'php':
        expect = 'array(%s)' % ','.join(str(x) for x in expect)
        print "_c(%r,%s,%s);" % (slice_, actual, expect)

    if mode == 'python':
        print "_c(%r,%s,%s);" % (slice_, actual, expect)

    if mode == 'js':
        print "_c(%r,%s,%s);" % (slice_, actual, expect)

wie man es benutzt:

in eine Datei speichern (test.py)Platzieren Sie Ihren Python-, PHP- oder Javascript-Code zwischen"""sLaufpython test.py | python oderpython test.py | php oderpython test.py | node

Antworten auf die Frage(6)

Ihre Antwort auf die Frage